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 C (judge verdict: Accepted)

// AOJ 2663: RUPC
// 2018.1.3 bal4u@uu

#include <stdio.h>
#include <stdlib.h>

int a[300002]; long long sa[300002]; int sz;
int b[300002];
long long c[300002];

int cmp(int *a, int *b) { return *a - *b; }

//#define getchar_unlocked()  getchar()
int in()
{
	int n, c;
//	while ((c = getchar_unlocked()) < '0');
	c = getchar_unlocked();
	n = 0; do n = (n<<3)+(n<<1) + (c & 0xf), c = getchar_unlocked();
	while (c >= '0');
	return n;
}

long long inl()
{
	int c; long long n;
//	while ((c = getchar_unlocked()) < '0');
	c = getchar_unlocked();
	n = 0; do n = (n<<3)+(n<<1) + (c & 0xf), c = getchar_unlocked();
	while (c >= '0');
	return n;
}

int bsch(int x)
{
	int m, l = 0, r = sz;

    while (l < r) {
        m = (l + r) >> 1;
		if (a[m] == x) return m;
        if (a[m] < x) l = m + 1; else r = m;
    }
	return l-1;
}

int uniq(int *a, int n)
{
	int i, j, k;
	
	for (i = 0, j = 1; j < n; j++) {
		k = 1;
		while (j < n && a[j] == a[i]) j++, k++;
		if (j < n) {
			if (i == 0) sa[0] = (long long)a[0]*k;
			else        sa[i] = sa[i-1] + (long long)a[i]*k;
			if (++i != j) a[i] = a[j];
		}
	}
	if (i == 0) sa[0] = (long long)a[0]*k;
	else        sa[i] = sa[i-1] + (long long)a[i]*k; 
	return i+1;
}

int main()
{
	int n, m, i;
	long long s;

	n = in();
	for (i = 0; i < n; i++) a[i] = in();
	qsort(a, n, sizeof(int), cmp);
	sz = uniq(a, n);

	m = in();
	for (i = 0; i < m; i++) b[i] = in();
	for (i = 0; i < m; i++) c[i] = inl();

	for (i = 0; i < m; i++) {
		if (b[i] < a[0]) s = 0;
		else             s = sa[bsch(b[i])];

		puts(s >= c[i]? "Yes": "No");
	}
	return 0;
}