Problem:
B : RUPC

問題文

ロシア連邦でプログラミングコンテストが開催される。コンテストには N 個の問題が出題され、M 人の参加者がいる。問題 i には得点 a_i が設定されており、参加者 j の実力は b_j であることがわかっている。問題 i と参加者 j について、 a_i ≤ b_j のときかつそのとき限り、参加者 j は問題 i を必ず解くことができる。 コンテストを通した参加者の得点は、その人が解くことができた問題の得点の総和である。また、参加者 j は、このコンテストでの目標点数 c_j を定めている。

各参加者が、目標点数以上の得点を獲得できるか判定せよ。

入力

入力は以下の形式で与えられる。

N
a_{0} a_{1} a_{2} … a_{N−1}
M
b_{0} b_{1} b_{2} … b_{M−1}
c_{0} c_{1} c_{2} … c_{M−1}

制約

入力はすべて整数である

1 \≤ N \≤ 300\,000

1 \≤ M \≤ 300\,000

0 \≤ a_{i} \≤ 1\,000\,000

0 \≤ b_{i} \≤ 1\,000\,000

0 \≤ c_{i} \≤ ∑a_k

出力

答えを M 行で出力せよ。 i 行目には、参加者 i−1 が目標点数以上の得点を獲得できるなら Yes、できないなら No と出力せよ。

サンプル

サンプル入力1

6
1 2 1 3 4 5
7
1 3 4 5 3 1 0
2 4 5 3 4 5 3

サンプル出力1

Yes
Yes
Yes
Yes
Yes
No
No

各参加者の得られる得点は以下のようになる。

参加者0 : 1+1=2

参加者1 : 1+2+1+3=7

参加者2 : 1+2+1+3+4=11

参加者3 : 1+2+1+3+4+5=16

参加者4 : 1+2+1+3=7

参加者5 : 1+1=2

参加者6 : 0

サンプル入力2

8
1 1 2 3 3 4 6 100
4
1 3 4 99
1 10 15 120

サンプル出力2

Yes
Yes
No
No

Solution in JAVA (judge verdict: Runtime Error)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

import static java.lang.Integer.parseInt;

/**
 * RUPC
 */
public class Main {

	static final int MAX = 1_000_001;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		String[] words;

		//
		int N = parseInt(br.readLine());
		long[] sum = new long[MAX];

		StringTokenizer st = new StringTokenizer(br.readLine());

		for (int i = 0; i < N; i++) {
			int a = parseInt(st.nextToken());
			sum[a]++;
		}

		for (int i = 1; i < MAX; i++) {
			sum[i] = sum[i] * i + sum[i - 1];
		}

		//
		int M = parseInt(br.readLine());
		int[] b = new int[M];
		long[] c = new long[M];

		st = new StringTokenizer(br.readLine());

		for (int i = 0; i < M; i++) {
			b[i] = parseInt(st.nextToken());
		}

		st = new StringTokenizer(br.readLine());

		for (int i = 0; i < M; i++) {
			c[i] = parseInt(st.nextToken());
		}

		//
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < M; i++) {
			if (sum[b[i]] >= c[i]) {
				sb.append("Yes\n");
			} else {
				sb.append("No\n");
			}
		}

		System.out.print(sb.toString());

	}
}