别上来就给最下面的大圆盘赋值个INT_MAX,我特别急,结果在倍增预处理的时候,上来就爆int了。
(我真蠢哈哈)
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<iostream>
#include<climits>
#include<stack>
using namespace std;
const int maxn = 100005;
int n, q, d[maxn], c[maxn];
int nxt[maxn][32], sc[maxn][32];
int lg[maxn];
int s[maxn], top = 0;
int main() {
scanf("%d%d", &n, &q);
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &d[i], &c[i]);
while (d[i] > d[s[top]] && top != 0) {
nxt[s[top]][0] = i;
sc[s[top]][0] = c[i];
top--;
}
s[++top] = i;
}
c[n + 1] = INT_MAX/2;
while (top != 0) {
nxt[s[top]][0] = n + 1;
sc[s[top]][0] = c[n + 1];
top--;
}
for (int j = 1; j <= lg[n]; j++)
for (int i = 1; i + (1 << j) <= n + 1; i++) {
nxt[i][j] = nxt[nxt[i][j - 1]][j - 1];
sc[i][j] = sc[i][j - 1] + sc[nxt[i][j - 1]][j - 1];
}
while (q--) {
int r, v;
scanf("%d%d", &r, &v);
if (c[r] < v) {
v -= c[r];
for (int i = lg[n]; i >= 0; i--) {
if (!nxt[r][i]) continue;
if (sc[r][i] < v) {
v -= sc[r][i];
r = nxt[r][i];
}
}
r = nxt[r][0];
}
if (r == n + 1) r = 0;
printf("%d\n", r);
}
return 0;
}