基本照抄身入浅出的,没想到才30分。。我还是太菜了吗
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
int n,q,d[N],c[N],f[N][17],g[N][17],Max[N][17];
int qry(int l,int r){
int k=log2(r-l+1);
return max(Max[l][k],Max[r-(1<<k)+1][k]);
}
main(){
cin>>n>>q;
for(int i=1;i<=n;++i)cin>>d[i]>>c[i],*Max[i]=d[i];
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i+(1<<j)-1<=n;++i)
Max[i][j]=max(Max[i][j-1],Max[i+(1<<j-1)][j-1]);
c[n+1]=1e9;
for(int i=1;i<n;++i){
int l=i+1,r=n+1,mid;
while(l<=r){
mid=l+r>>1;
if(qry(i+1,mid)<=d[i])l=mid+1;
else r=mid-1;
}
f[i][0]=r+1;
g[i][0]=c[r+1];
}
f[n][0]=n+1,g[n][0]=1e9;
//f[n+1][0]=n+1;
//for(int j=1;(1<<j)<=n;++j)
//for(int i=1;i+(i<<j)-1<=n;++i){
for(int j=1;(1<<j-1)<=n;++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];
}
for(int r,v;q--;){
cin>>r>>v;
if(v>c[r])v-=c[r];
else {cout<<r<<'\n';continue;}
//for(int i=log2(n);~i;--i)
for(int i=log2(n)+1;~i;--i)
if(v>g[r][i])
v-=g[r][i],r=f[r][i];//类似二分
r=f[r][0];//再来一次
cout<<(r==n+1?0:r)<<'\n';
}
}