应该是建出来的树的正确性有问题,在随机权值的情况下答案也随机
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
#define ll long long
#define pi pair<int,int>
int n,ls[MAXN*90],rs[MAXN*90],rt[MAXN];
int w[MAXN*90],val[MAXN*90],cnt[MAXN*90],siz[MAXN*90],vtx;
int irand()
{
return 32000*rand()+rand();
}
int getnode(int v)
{
vtx++;
w[vtx]=irand();
cnt[vtx]++;
siz[vtx]++;
val[vtx]=v;
return vtx;
}
void cpy(int x,int y)
{
ls[x]=ls[y],rs[x]=rs[y];
cnt[x]=cnt[y],val[x]=val[y];
siz[x]=siz[y],w[x]=w[y];
}
void pushup(int rt)
{
siz[rt]=cnt[rt]+siz[ls[rt]]+siz[rs[rt]];
}
pair<int,int> split(int rt,int k)
{
if(!rt)return {0,0};
int dir=getnode(0);
cpy(dir,rt);
if(k<val[rt])
{
pi tmp=split(ls[rt],k);
ls[dir]=tmp.second;
pushup(dir);
return {tmp.first,dir};
}
else
{
pi tmp=split(rs[rt],k);
rs[dir]=tmp.first;
pushup(dir);
return {dir,tmp.second};
}
}
int merge(int x,int y)
{
if(!x&&!y)return 0;
int dir=getnode(0);
if(!x)
{
cpy(dir,y);
return dir;
}
if(!y)
{
cpy(dir,x);
return dir;
}
if(w[x]>w[y])
{
cpy(dir,x);
rs[dir]=merge(rs[x],y);
}
else
{
cpy(dir,y);
ls[dir]=merge(x,ls[y]);
}
pushup(dir);
return dir;
}
int getrnk(int rt,int k)
{
if(!rt)return 1;
if(val[rt]==k)return 1+siz[ls[rt]];
if(k<val[rt])return getrnk(ls[rt],k);
return siz[ls[rt]]+cnt[rt]+getrnk(rs[rt],k);
}
int getval(int rt,int rk)
{
if(siz[ls[rt]]>=rk)return getval(ls[rt],rk);
if(siz[ls[rt]]+cnt[rt]>=rk)return val[rt];
return getval(rs[rt],rk-siz[ls[rt]]-cnt[rt]);
}
int getpre(int rt,int k)
{
if(!rt)return -2147483647;
if(k<=val[rt])return getpre(ls[rt],k);
return max(getpre(rs[rt],k),val[rt]);
}
int getsuf(int rt,int k)
{
if(!rt)return 2147483647;
if(k>=val[rt])return getsuf(rs[rt],k);
return min(getsuf(ls[rt],k),val[rt]);
}
int main()
{
// freopen("fhq.in","r",stdin);
// freopen("fhq.out","w",stdout);
srand(time(0));
cin>>n;int asdf=1;
for(int i=1;i<=n;i++)
{
int v,opt,k;asdf++;
scanf("%d%d%d",&v,&opt,&k);
if(opt==1)
{
int x,y,z;asdf--;
pi tmp=split(rt[v],k);
z=tmp.second;
tmp=split(tmp.first,k-1);
x=tmp.first,y=tmp.second;
if(y)cnt[y]++;
else y=getnode(k);
rt[i]=merge(merge(x,y),z);
}
if(opt==2)
{
int x,y,z;asdf--;
pi tmp=split(rt[v],k);
z=tmp.second;
tmp=split(tmp.first,k-1);
x=tmp.first,y=tmp.second;
if(!y)
{
rt[i]=merge(x,z);
continue;
}
cnt[y]--;
if(cnt[y])rt[i]=merge(merge(x,y),z);
else rt[i]=merge(x,z);
}
if(opt==3)
{
rt[i]=rt[v];
printf("%d\n",getrnk(rt[v],k));
}
if(opt==4)
{
rt[i]=rt[v];
printf("%d\n",getval(rt[v],k));
}
if(opt==5)
{
rt[i]=rt[v];
printf("%d\n",getpre(rt[v],k));
}
if(opt==6)
{
rt[i]=rt[v];
printf("%d\n",getsuf(rt[v],k));
}
}
return 0;
}