rt,挂得莫名其妙,还想不到 hack
(debug没删)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
const int MAXN = 100005;
int n, Q;
int d[MAXN], c[MAXN];
int f[MAXN][25], fa[MAXN][25];
int top, stc[MAXN];
inline void Init() {
memset(f, 0x3f, sizeof(f));
for (int i = 1; i <= n; ++ i)
f[i][0] = c[i];
// for (int i = 1; i <= n; ++ i) {
// printf ("%lld : ", i);
// for (int j = 0; j <= 20; ++ j)
// printf ("%lld ", f[i][j]);
// puts("");
// }
for (int i = 1; i <= n; ++ i) {
while (top && d[stc[top]] < d[i]) fa[stc[top --]][0] = i;
stc[++ top] = i;
}
for (int i = 1; i <= 20; ++ i)
for (int j = 1; j <= n; ++ j) {
if (j + (1 << (i - 1)) <= n)
f[j][i] = f[j][i - 1] + f[j + (1 << (i - 1))][i - 1];
fa[j][i] = fa[fa[j][i - 1]][i - 1];
}
// for (int i = 1; i <= n; ++ i) {
// printf ("%lld : ", i);
// for (int j = 0; j <= 20; ++ j)
// printf ("%lld ", f[i][j]);
// puts("");
// }
}
inline int Query(int x, int v) {
for (int i = 20; ~i; -- i)
if (v > f[x][i])
v -= f[x][i], x = fa[x][i];
return x;
}
signed main()
{
scanf ("%lld%lld", &n, &Q);
for (int i = 1; i <= n; ++ i)
scanf ("%lld%lld", d + i, c + i);
Init();
while (Q --) {
int r, v; scanf ("%lld%lld", &r, &v);
printf ("%lld\n", Query(r, v));
}
return 0;
}