이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int N, Q, D[100005], wei[25][100005], anc[25][100005];
stack<int> S;
int main() {
	memset(anc, -1, sizeof anc);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N >> Q;
	for (int i = 1; i <= N; i++) {
		cin >> D[i] >> wei[0][i];
	}
	for (int i = N; i >= 1; i--) {
		while (!S.empty() && D[S.top()] <= D[i]) {
			S.pop();
		}
		anc[0][i] = (S.empty() ? N + 1 : S.top());
		S.push(i);
	}
	for (int k = 1; k <= 20; k++) {
		for (int i = 1; i <= N; i++) {
			if (anc[k - 1][i] == -1) {
				continue;
			}
			anc[k][i] = anc[k - 1][anc[k - 1][i]];
			wei[k][i] = wei[k - 1][i] + wei[k - 1][anc[k - 1][i]];
		}
	}
	for (int i = 1, R, V; i <= Q; i++) {
		cin >> R >> V;
		for (int k = 20; k >= 0; k--) {
			if (anc[k][R] == -1) {
				continue;
			}
			if (wei[k][R] < V) {
				V -= wei[k][R];
				R = anc[k][R];
			}
		}
		cout << (R == N + 1 ? 0 : R) << '\n';
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |