Problem:
Score : 200 points

Problem Statement

Given N integers A_1, ..., A_N, compute A_1 \times ... \times A_N.

However, if the result exceeds 10^{18}, print -1 instead.

Constraints

2 \leq N \leq 10^5

0 \leq A_i \leq 10^{18}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 ... A_N

Output

Print the value A_1 \times ... \times A_N as an integer, or -1 if the value exceeds 10^{18}.

Sample Input 1

2
1000000000 1000000000

Sample Output 1

1000000000000000000

We have 1000000000 \times 1000000000 = 1000000000000000000.

Sample Input 2

3
101 9901 999999000001

Sample Output 2

-1

We have 101 \times 9901 \times 999999000001 = 1000000000000000001, which exceeds 10^{18}, so we should print -1 instead.

Sample Input 3

31
4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0

Sample Output 3

0

Solution in C# (Mono-csc 3.5.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.Remoting;
using System.Security.AccessControl;
using System.Security.Cryptography;
using System.Xml;

namespace Atcoder
{
    class Program
    {
        static void Main(string[] args)
        {
            var n = ReadLineInt();
            var a = ReadLineLongSpilit();
            long re = 1;

            for (int i = 0; i < n; i++) {
                re *= a[i];
            }

            if(re >= Math.Pow(10, 18)) {
                Console.WriteLine(-1);
                return;
            }

            Console.WriteLine(re);
        }

        //メモ

        //アルゴリズム

        //・全探索解

        /*
         * 例 [A, B, C]
         *
         *  A - B, A - C
         *  B - C
         * 
         *   for (int i = 0; i < n; i++) {
         *  
         *       for (int j = i + 1; j < n; j++) {
         *
         *           array[i], array[j]
         *
         *       }
         *   }
         */

        // ・配列の前後を見る

        /*
         *  例 array[1, 2, 3, 4, 5]
         *  
         *  r = 3;
         * 
         *  array[i - 1] => 1
         *  array[i] => 2
         *  array[i + 1] => 3
         * 
         * //範囲
         * int r = 3;
         * 
         * for(int i = 1; i <= array.Length - r; i++) { }
         * 
         */

        //配列 --------------------

        //降順
        //Array.Sort(h);
        //Array.Reverse(h);

        //合計値
        //array.Sum();

        //最大値
        //List.Sort(); List[Count() - 1] 

        //連続の整数配列を作成
        //
        // 1, 2, 3, 4, 5,..., n
        //var continuous = Enumerable.Range(1, n).ToList();

        //--------------------

        //切り捨て

        //double d = Math.Floor(n);

        //切り上げ

        //double d = Math.Celling(n);

        //kのn乗
        //(int) Math.Pow(k, n);

        //for文の逆
        //for(int i = array.Length - 1; i >= 0; i--) { }


        /// <summary>
        /// 最大公約数
        /// </summary>
        public static long Gcd(long a, long b)
        {
            while (true) {
                if (a < b) { long tmp = b; b = a; a = tmp; }
                if (a % b == 0) return b;
                var x = a;
                a = b;
                b = x % b;
            }
        }

        /// <summary>
        /// 最小公倍数
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static long Lcm(long a, long b) => a / Gcd(a, b) * b;

        /// <summary>
        /// コンビネーション
        /// </summary>
        static int nCm(int n, int m)
        {
            if (m == 0) return 1;
            if (n == 0) return 0;
            return n * nCm(n - 1, m - 1) / m;
        }

        /// <summary>
        /// 数字配列の重複をカウント
        /// </summary>
        public static int DistinctInt(IEnumerable<int> array)
        {
            var q = array.Distinct().Count();
            return array.Count() - q;
        }

        /// <summary>
        /// 文字配列の重複をカウント
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static int DistinctString(IEnumerable<string> array)
        {
            var q = array.Distinct().Count();
            return array.Count() - q;
        }


        public static string ReadLine() => Console.ReadLine();
        public static int ReadLineInt() => int.Parse(Console.ReadLine());
        public static long ReadLineLongInt() => long.Parse(Console.ReadLine());
        public static string[] ReadLineStringSplit(char a = ' ') => ReadLine().Split(a).ToArray();
        public static int[] ReadLineIntSpilit(char a = ' ') => ReadLine().Split(a).Select(x => int.Parse(x)).ToArray();
        public static long[] ReadLineLongSpilit(char a = ' ') => ReadLine().Split(a).Select(x => long.Parse(x)).ToArray();
        public static Double[] ReadLineDoubleSpilit(char a = ' ') => ReadLine().Split(a).Select(x => double.Parse(x)).ToArray();

        static string[] GetAlphaLowerArray() => new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
        static string[] GetAlphaUpperArray() => new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
    }
}