72分...
#14~#20全TLE
不知道是我常数过大还是程序自己跑一半自闭(死循环)了
各位好心人帮帮蒟蒻吧...
#include <bits/stdc++.h>
//#include <bits/extc++.h>
using namespace std;
//using namespace __gnu_cxx;
#define debug cout<<"Ok"<<endl;
#define sc second
#define fr first
#define pb push_back
#define LL long long
typedef const int Int;
typedef pair<int,int> pii;
typedef double db;
Int N=6e7+5,M=5e5+5;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-')f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
struct node{
int ls,rs;
int val;
int rnk;
int size;
};
node tr[N];
int tot;
int n,m,i;
int ver[M];
int qver;
void pushup(Int &p){
tr[p].size=tr[tr[p].ls].size+tr[tr[p].rs].size+1;
}
inline Int clonep(Int &p){
tr[++tot]=tr[p];
return tot;
}
void split(int p,Int &v,int &x,int &y){
if(!p){
x=y=0;
return;
}
p=clonep(p);
if(tr[p].val<=v){
x=p;
split(tr[p].rs,v,tr[p].rs,y);
}
else{
y=p;
split(tr[p].ls,v,x,tr[p].ls);
}
pushup(p);
}
Int merge(Int &x,Int &y){
if(!x||!y)return x+y;
if(tr[x].val<=tr[y].val){
tr[x].rs=merge(tr[x].rs,y);
pushup(x);
return x;
}
else{
tr[y].ls=merge(x,tr[y].ls);
pushup(y);
return y;
}
}
inline Int addp(Int &x){
tr[++tot].size=1;
tr[tot].rnk=rand();
tr[tot].val=x;
return tot;
}
void insert(Int &v){
int x,y;
split(ver[qver],v,x,y);
int newnode=addp(v);
ver[i]=merge(merge(x,newnode),y);
}
void delt(Int &v){
int x,y,z;
split(ver[qver],v,x,z);
split(x,v-1,x,y);
y=merge(tr[y].ls,tr[y].rs);
ver[i]=merge(x,merge(y,z));
}
Int queryrank(Int &v){
int x,y;
split(ver[qver],v-1,x,y);
int ret=tr[x].size;
ver[i]=merge(x,y);
return ret;
}
Int queryval(int rnk,int p=ver[qver]){
register int L;
while(p){
L=tr[p].ls;
if(tr[L].size+1==rnk)return tr[p].val;
if(tr[L].size>=rnk)p=L;
else p=tr[p].rs,rnk-=tr[L].size+1;
}
}
Int querypre(Int &v){
int x,y;
split(ver[qver],v-1,x,y);
int ret=queryval(tr[x].size,x);
ver[i]=merge(x,y);
return ret;
}
Int queryrev(Int &v){
int x,y;
split(ver[qver],v,x,y);
int ret=queryval(1,y);
ver[i]=merge(x,y);
return ret;
}
int op,x;
int main(){
srand((unsigned)time(NULL));
n=read();
insert(INT_MIN+1),insert(INT_MAX);
for(i=1;i<=n;i++){
qver=read(),op=read(),x=read();
if(op==1)insert(x);
if(op==2)delt(x);
if(op==3)printf("%d\n",queryrank(x));
if(op==4){
ver[i]=clonep(ver[qver]);
printf("%d\n",queryval(x+1));
}
if(op==5)printf("%d\n",querypre(x));
if(op==6)printf("%d\n",queryrev(x));
}
return 0;
}