我用构建树+倍增lca,哪里出错了?
#include<bits/stdc++.h>
using namespace std;
//#define int long long
inline int read(){
int s=0,f=1;
char ch=' ';
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*f;
}
inline void write(long long x){
if(x<0)putchar('-'),x=-x;
if(x<10){
putchar(x+48);
return;
}
write(x/10);
putchar((x%10)+48);
}
struct node{
int d;
int v;
}a[100005];
int n=read(),m=read(),lg[100005],de[100005],f[100005][20],g[100005][20],s[100005],p,r,top,h[100005],tot,ans;
struct edge{
int to;
int nt;
}e[100005];
void add(int from,int to){e[++tot]=(edge){to,h[from]},h[from]=tot;};
void dfs(int fa,int x){
de[x]=de[fa]+1,f[x][0]=fa,g[x][0]=a[x].v;
for(int i=1;i<=lg[de[x]];i++)f[x][i]=f[f[x][i-1]][i-1],g[x][i]=g[f[x][i-1]][i-1]+g[x][i-1];
for(int i=h[x];i;i=e[i].nt)dfs(x,e[i].to);
}
signed main(){
a[++n]=(node){0x3f3f3f,0x3f3f3f};
for(int i=1;i<n;i++)a[i].d=read(),a[i].v=read();
for(int i=1;i<=n;i++){
while(top&&a[i].d>a[s[top]].d)lg[s[top--]]=i;
s[++top]=i;
}
for(int i=1;i<=n;i++)add(lg[i],i);
for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
dfs(0,n);
while(m--){
r=read(),p=read();
if(a[r].v>=p){
write(r),putchar(10);
continue;
}
for(int i=lg[de[r]];i>=0;i--)if(g[r][i]<p)p-=g[r][i],r=f[r][i];
if(r==n)puts("0");
else write(r),putchar(10);
}
return 0;
}