不知道出了什么问题,连样例也过不了
#include<iostream>
using namespace std;
struct node {
int lc;
int rc;
int w;
};
int cnt=0,root[1000001];
node tr[25000001];
int build() {
tr[++cnt].lc=0;
tr[cnt].rc=0;
tr[cnt].w=0;
return cnt;
}
void pushup(int k) {
tr[k].w=0;
if(tr[k].lc) tr[k].w=tr[tr[k].lc].w;
if(tr[k].rc) tr[k].w+=tr[tr[k].rc].w;
}
void add(int k1,int k2,int l,int r,int x,int p) {
if(l==r) {tr[k1].w+=p;return ;}
int mid=(l+r)>>1;
if(x<=mid) {
tr[k1].rc=tr[k2].rc;
tr[k1].lc=build();
add(tr[k1].lc,tr[k2].lc,l,mid,x,p);
} else {
tr[k1].lc=tr[k2].lc;
tr[k1].rc=build();
add(tr[k1].rc,tr[k2].rc,mid+1,r,x,p);
}
pushup(k1);
}
int ask(int k,int l,int r,int ql,int qr) {
if(l>=ql&&r<=qr) {
return tr[k].w;
}
int ret=0;
int mid=(l+r)>>1;
if(ql<=mid) if(tr[k].lc)ret+=ask(tr[k].lc,l,mid,ql,qr);
if(qr>mid) if(tr[k].rc)ret+=ask(tr[k].rc,mid+1,r,ql,qr);
return ret;
}
int rnk(int k,int x) {
return ask(root[x],-1e9-1,1e9+1,-1e9-1,k-1)+1;
}
int kth(int k,int l,int r,int x) {
if(l==r) {
return l;
}
int mid=(l+r)>>1;
if(x<=tr[tr[k].lc].w) return kth(tr[k].lc,l,mid,x);
return kth(tr[k].rc,mid+1,r,x-tr[tr[k].lc].w);
}
int pre(int k,int x) {
if(rnk(k,x)==1) return -2147483647;
return kth(root[x],-1e9-1,1e9+1,rnk(k,x)-1);
}
int nxt(int k,int x) {
if(rnk(k,x)+ask(root[x],-1e9-1,1e9+1,k,k)-1==ask(root[x],-1e9-1,1e9+1,-1e9-1,1e9+1)) return 2147483647;
return kth(root[x],-1e9-1,1e9+1,rnk(k,x)+ask(root[x],-1e9-1,1e9+1,k,k));
}
int n;
int main() {
root[0]=build();
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i) {
int vi,opt,x;
cin>>vi>>opt>>x;
if(opt==1) root[i]=build(),add(root[i],root[vi],-1e9-1,1e9+1,x,1);
if(opt==2) root[i]=build(),add(root[i],root[vi],-1e9-1,1e9+1,x,-1);
if(opt==3) root[i]=root[vi],cout<<rnk(x,vi)<<endl;
if(opt==4) root[i]=root[vi],cout<<kth(root[vi],-1e9-1,1e9+1,x)<<endl;
if(opt==5) root[i]=root[vi],cout<<pre(x,vi)<<endl;
if(opt==6) root[i]=root[vi],cout<<nxt(x,vi)<<endl;
}
}