Problem:
バトンリレーゲーム

アカベ高校では、毎年全校生徒が参加するゲームを行っています。まず、校庭に N 人の全校生徒が円形に並びます。図のように、各生徒は 0 から N-1 までの番号が書かれたゼッケンを付けています。

ゲームではバトンを１本使い、最初はゼッケン 0 番の生徒がバトンを持っています。そこから、以下の手順を M 回繰り返します。まず、現時点でバトンを持っている生徒が適当な正の整数 a を宣言します。a が偶数のときは時計回り、奇数のときは反時計回りに隣の生徒にバトンを渡していき、a 番目にバトンを受け取った生徒が脱落します。脱落した生徒は、時計回りで隣の生徒にバトンを渡し、円から抜けます。

ゲームが終わった後に円に残った生徒は、放課後の掃除が１年間免除されます。しかし、ここ数年は生徒数が増えたため、全校生徒を集めるのが難しくなってきています。そこで、競技プログラミング部のあなたは、シミュレーションで掃除が免除される生徒を求めるプログラムを作成するよう頼まれました。

指定した生徒が掃除を免除されているかどうかを質問したとき、それに答えるプログラムを作成してください。

入力

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

N M Q
a1 a2 ... aM
q1 q2 ... qQ

入力は３行であり、１行目に生徒の人数 N (10 ≤ N ≤ 200000)、繰り返し回数 M (5 ≤ M < N)、生徒が掃除を免除されるかどうかを問い合わせる質問の個数 Q (1 ≤ Q ≤ 1000) が与えられる。続く１行に、i 回目の繰り返しで最初にバトンを持っている生徒が宣言する整数ai (1 ≤ ai ≤ 100) が与えられる。続く１行に、質問としてゼッケン番号 qi (0 ≤ q < N) が与えられる。

出力

質問ごとに、ゼッケン番号 qi の生徒が掃除を免除されるかどうかを i 行目に出力する。掃除が免除されるなら 1 を、されないなら 0 を出力する。

入出力例

入力例

10 5 3
2 6 5 18 3
3 0 5

出力例

1
0
1

Solution in C++ (judge verdict: Time Limit Exceeded)

#include "stdio.h"
#define MAX_STU 200000

int stu;
int num;
int query;
int back[MAX_STU] = {};
int clock[MAX_STU] = {};
int flag[MAX_STU] = {};
int call;
int box;
int next;
int now = 0;
int ans[1000] = {};

int max(int a, int b) {
	if (a < b)return a;
	return b;
}

int main() {
	scanf("%d %d %d", &stu, &num, &query);
	for (int i = 0; i < stu; i++) {
		flag[i] = 1;
		clock[i] = max(100,stu);
		back[i] = max(100,stu);
	}
	for (int i = 0; i < num; i++) {
		scanf("%d", &call);
		box = 0;
		next = 0;
		if (call % 2 == 0) {
			while (box < call) {
				box += clock[(now+next*max(100,stu))%stu];
				next++;
			}
			for (int j = 0; j < max(100,stu); j++) {
				if (flag[(now + next * max(100,stu) - j)%stu] == 1) {
					if (box == call) {
						flag[(now + next * max(100,stu) - j) % stu] = 0;
					//	printf("%d?????±???\n", (now + next * max(100, stu) - j) % stu);
						now = (now + next * max(100,stu) - j) % stu;
						for (int k = 1; k <= max(100,stu); k++) {
							clock[(now - k+stu*100)%stu]--;
							back[(now + k)%stu]--;
						}
						break;
					}
					box--;
				}
			}
			box = 0;
			next = 0;
			while (box == 0) {
				box += clock[(now+max(100,stu)*next+stu*100)%stu];
				next++;
			}
			for (int j = 0; j < max(100,stu); j++) {
				if (flag[(now + next * max(100,stu) - j +stu*100) % stu] == 1) {
					if (box == 1) {
						now = (now + next * max(100, stu) - j +stu*100) % stu;
				//		printf("%d????????£???\n", now);
						break;
					}
					box--;
				}
			}
		}
		else {
			while (box < call) {
				box += back[(now - next*max(100, stu)+stu*100) % stu];
				next++;
			}
			//printf("%d?????¨?????????????????????\n", next*max(100, stu));
			for (int j = 0; j < max(100, stu); j++) {
				if (flag[(now - next * max(100, stu) + j+stu*100) % stu] == 1) {
					if (box == call) {
						flag[(now - next * max(100, stu) + j+stu*100) % stu] = 0;
					//	printf("%d?????±???\n", (now - next * max(100, stu) + j+stu*100) % stu);
						now = (now - next * max(100, stu) + j+stu*100) % stu;
						for (int k = 1; k <= max(100, stu); k++) {
							clock[(now - k +stu*100) % stu]--;
							back[(now + k) % stu]--;
						}
						break;
					}
					box--;
				}
			}
			box = 0;
			next = 0;
			while (box == 0) {
				box += clock[(now + max(100, stu)*next +stu*100) % stu];
				next++;
			}
			for (int j = 0; j < max(100, stu); j++) {
				if (flag[(now + next * max(100, stu) - j +stu*100) % stu] == 1) {
					if (box == 1) {
						now = (now + next * max(100, stu) - j +stu*100) % stu;
				//		printf("%d????????£???\n", now);
						break;
					}
					box--;
				}
			}
		}
	}
	for (int i = 0; i < query; i++) {
		scanf("%d", &now);
		ans[i] = flag[now];
	}
	for (int i = 0; i < query; i++) {
		printf("%d\n", ans[i]);
	}
	return 0;
}