rt,tlq 好像没有一个跟我一样的。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define db double
#define ld long double
#define M 500005
#define N 10000005
#define mod 1000000007
#define inf 1e9
#define dinf 1e15
#define linf 1e18+7
#define eps 1e-15
#define delta 0.997
int n;
struct Query{
int v,op,x;
}q[M];
int lsh[M],cnt;
int rt[N],tot;
struct segment_tree{
int sum[N];
int ls[N],rs[N];
void push_up(int p){
sum[p]=sum[ls[p]]+sum[rs[p]];
}
int update(int p,int i,int L,int R,int x){
int root=++tot;
sum[root]=sum[p];
ls[root]=ls[p];
rs[root]=rs[p];
sum[root]+=x;
if(sum[root]<0) sum[root]=0;
if(L==R) return root;
int mid=(L+R)>>1;
if(i<=mid) ls[root]=update(ls[p],i,L,mid,x);
else rs[root]=update(rs[p],i,mid+1,R,x);
return root;
}
int getrk(int p,int i,int L,int R){
if(L==R) return 0;
int mid=(L+R)>>1;
if(i<=mid) return getrk(ls[p],i,L,mid);
return sum[ls[p]]+getrk(rs[p],i,mid+1,R);
}
int getval(int p,int i,int L,int R){
if(L==R) return L;
int mid=(L+R)>>1;
if(sum[ls[p]]>=i) return getval(ls[p],i,L,mid);
return getval(rs[p],i-sum[ls[p]],mid+1,R);
}
int getpre(int p,int x){
int rk=getrk(p,x,1,cnt)+1;
return lsh[getval(p,rk-1,1,cnt)];
}
int getnxt(int p,int x){
int rk=getrk(p,x+1,1,cnt);
return lsh[getval(p,rk+1,1,cnt)];
}
}t;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d %d %d",&q[i].v,&q[i].op,&q[i].x);
if(q[i].op!=4) lsh[++cnt]=q[i].x;
}
lsh[++cnt]=-INT_MAX; lsh[++cnt]=INT_MAX;
stable_sort(lsh+1,lsh+1+cnt);
cnt=unique(lsh+1,lsh+1+cnt)-lsh-1;
for(int i=1;i<=n;++i) if(q[i].op!=4) q[i].x=lower_bound(lsh+1,lsh+1+cnt,q[i].x)-lsh;
rt[0]=t.update(rt[0],1,1,cnt,1);
rt[0]=t.update(rt[0],cnt,1,cnt,1);
for(int i=1;i<=n;++i){
if(1<=q[i].op&&q[i].op<=2){
if(q[i].op==1) rt[i]=t.update(rt[q[i].v],q[i].x,1,cnt,1);
if(q[i].op==2) rt[i]=t.update(rt[q[i].v],q[i].x,1,cnt,-1);
} else {
if(q[i].op==3) printf("%d\n",t.getrk(rt[q[i].v],q[i].x,1,cnt));
if(q[i].op==4) printf("%d\n",lsh[t.getval(rt[q[i].v],q[i].x+1,1,cnt)]);
if(q[i].op==5) printf("%d\n",t.getpre(rt[q[i].v],q[i].x));
if(q[i].op==6) printf("%d\n",t.getnxt(rt[q[i].v],q[i].x));
rt[i]=rt[q[i].v];
}
}
return 0;
}