Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

問題文

有理数列 $X_0, X_1, X_2, ..., X_N$ がある。各項は以下のように定義される。

$X_0 = 0$

$X_i = X_{i-1}$ $op_i$ $Y_i$ ($1 \leq i \leq N$). ただし $op_i$ は $＋$、$−$、$×$、$÷$のいずれかである。

$X_N$ を求めよ。

入力

入力は以下の形式に従う。与えられる数は全て整数である。

$N$
$o_1$ $Y_1$
$o_2$ $Y_2$
$...$
$o_N$ $Y_N$

$o_i = 1$ のとき $op_i$ は＋、$o_i = 2$ のとき $op_i$ は−、$o_i = 3$ のとき $op_i$ は×、$o_i = 4$ のとき $op_i$ は÷である。

制約

$1 \leq N \leq 10^5$

$1 \leq o_i \leq 4$

$-10^6 \leq Y_i \leq 10^6$

$o_i=4$ ならば $Y_i \neq 0$

$X_N$ は $-2^{31}$ 以上 $2^{31}$ 未満の整数となる。

出力

$X_N$ の値を1行に出力せよ。

Sample Input 1

4
1 1
4 2
2 4
3 4

Output for the Sample Input 1

-14

$X_0 = 0$

$X_1 = X_0 ＋ 1 = 1$

$X_2 = X_1 ÷ 2 = 1/2$

$X_3 = X_2 − 4 = -7/2$

$X_4 = X_3 × 4 = -14$

Solution in JAVA (judge verdict: Time Limit Exceeded)

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
	
	public static class Rational{
		BigInteger upper, lower;

		public Rational(long upper, long lower) {
			super();
			this.upper = new BigInteger(upper + "");
			this.lower = new BigInteger(lower + "");
		}
		
		public void optimal(){
			BigInteger gcd = upper.gcd(lower);
			upper = upper.divide(gcd);
			lower = lower.divide(gcd);
		}
		
		public void add(int x){
			BigInteger add_v = new BigInteger(x + "").multiply(lower);
			upper = upper.add(add_v);
			optimal();
		}
		
		public void sub(int x){
			add(-x);
		}
		
		public void mul(int x){
			BigInteger mul_v = new BigInteger(x + "");
			upper = upper.multiply(mul_v);
			optimal();
		}
		
		public void div(int x){
			BigInteger div_v = new BigInteger(x + "");
			lower = lower.multiply(div_v);
			optimal();
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		final int N = sc.nextInt();
		
		Rational raito = new Rational(0, 1);
		
		for(int i = 0; i < N; i++){
			final int ops = sc.nextInt();
			final int value = sc.nextInt();
			
			if(ops == 1){
				raito.add(value);
			}else if(ops == 2){
				raito.sub(value);
			}else if(ops == 3){
				raito.mul(value);
			}else if(ops == 4){
				raito.div(value);
			}
		}
		
		System.out.println(raito.upper);
	}

}