結果

提出番号 522
提出者 neg4jaYR
言語 C++
提出日時 2017-07-21 23:58:08
問題名 (32)JOI国のお散歩事情 (Walking in JOI Kingdom)
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 1ms 8304KB
2 AC 100% 2ms 8336KB
3 AC 100% 2ms 8320KB
4 AC 100% 3ms 8320KB
5 AC 100% 18ms 9280KB

ソースコード

#include <cstdio>
#include <vector>
#include <algorithm>
typedef long long int ll;
using namespace std;
ll N, T, Q; 
ll A[100010], D[100010];
vector<ll> G, _G;
int main() {
	scanf("%lld%lld%lld", &N, &T, &Q);
	
	A[0] = -1000000000000000010;
	D[0] = -1;
	G.push_back(-2000000000000000000);
	_G.push_back(2000000000000000000);
	for (int i = 1; i <= N; i++) {
		scanf("%lld%lld", &A[i], &D[i]);
		if (D[i] == 2) D[i] = -1;
		if (D[i - 1] == 1 && D[i] == -1) {
			G.push_back((A[i - 1] + A[i]) / 2);
			_G.push_back((-A[i - 1] - A[i]) / 2);
		}
	}
	G.push_back(2000000000000000000);
	_G.push_back(-2000000000000000000);
	reverse(_G.begin(), _G.end());
	for (int i = 0; i < Q; i++) {
		ll X, J;
		scanf("%lld", &X);
		ll L = A[X] + T*D[X];
		if (D[X] == 1) {
			J = *lower_bound(G.begin(), G.end(), A[X]);
			if (L > J)printf("%lld\n", J);
			else printf("%lld\n", L);
		}
		else {
			J = -*lower_bound(_G.begin(), _G.end(), -A[X]);
			if (L < J)printf("%lld\n", J);
			else printf("%lld\n", L);
		}
	}
	
}