#include <bits/stdc++.h>
using namespace std;
const int N=100001;
int n,d[N],next[N],rmax[N][21],c[N],log_2[N],f[N][21],g[N][21],q,ans[N];
void init()
{
for(int i=1;i<=n;i++)
rmax[i][0]=d[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n-(1<<j)+1;i++)
rmax[i][j]=max(rmax[i][j-1],rmax[i+(i<<j-1)][j-1]);
}
int RMQ(int l,int r)
{
int k=log_2[r-l+1];
return max(rmax[l][k],rmax[r-(1<<k)+1][k]);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d%d",&d[i],&c[i]);
for(int i=2;i<=n;i++)
log_2[i]=log_2[i>>1]+1;
init();
c[n+1]=1000000000;
for(int i=1;i<n;i++)
{
int l=i+1,r=n+1,mid;
while(l<r)
{
mid=l+r>>1;
if(RMQ(i+1,mid)<=d[i])
l=mid+1;
else r=mid;
}
f[i][0]=l;
g[i][0]=c[f[i][0]];
}
f[n][0]=n+1;
g[n][0]=c[f[n][0]];
for(int j=1;j<=16;j++)
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
g[i][j]=g[i][j-1]+g[f[i][j-1]][j-1];
}
int cnt=0;
while(q--)
{
int r,v;
scanf("%d%d",&r,&v);
if(v>c[r])
{
v-=c[r];
for(int i=16;i>=0;i--)
if(v>g[r][i])
{
v-=g[r][i];
r=f[r][i];
}
r=f[r][0];
}
if(r==n+1) r=0;
ans[++cnt]=r;
}
for(int i=1;i<=cnt;i++)
printf("%d\n",ans[i]);
}
0分,[哭] 样例输出:5 0 5 4 2
我的输出:0 0 5 4 2
一字之差,到底错在哪里?求神犇指点