Treap合并写的,为什么我本地跑过了#1,也没爆栈,交上去#1却MLE了,别的点也都过了
#include <bits/stdc++.h>
using namespace std;
struct o{int lson,rson,key,siz,val,id;}l[400001];
int n,m,u,v,fa[400001],rt[400001];
char c;
void update(int x){l[x].siz=l[l[x].lson].siz+l[l[x].rson].siz+1;}
int findf(int x){
if(fa[x]!=x){
return fa[x]=findf(fa[x]);
}
return x;
}
void rotateL(int &x){
int y=l[x].rson;
l[x].rson=l[y].lson;
l[y].lson=x;
update(x);
update(y);
x=y;
}
void rotateR(int &x){
int y=l[x].lson;
l[x].lson=l[y].rson;
l[y].rson=x;
update(x);
update(y);
x=y;
}
void add(int a,int &x,int f,int son){
if(x==0){
if(son==1){
l[f].lson=a;
}
else{
l[f].rson=a;
}
update(f);
return;
}
if(l[a].val<=l[x].val){
add(a,l[x].lson,x,1);
update(x);
if(l[l[x].lson].key>l[x].key){
rotateR(x);
}
}
else{
add(a,l[x].rson,x,2);
update(x);
if(l[l[x].rson].key>l[x].key){
rotateL(x);
}
}
}
void merge(int &x,int y){
if(x==0){
return;
}
int ls=l[x].lson,rs=l[x].rson;
l[x].lson=0;
l[x].rson=0;
merge(ls,y);
merge(rs,y);
l[x].siz=1;
add(x,rt[y],0,0);
update(x);
update(y);
}
void check(int x,int y){
int fx=findf(x),fy=findf(y);
if(fx==fy){
return;
}
if(l[fx].siz>l[fy].siz){
swap(x,y);
swap(fx,fy);
}
fa[x]=fy;
merge(rt[x],fy);
}
int query(int x,int k){
if(k>l[x].siz){
return -1;
}
if(k==l[l[x].lson].siz+1){
return l[x].id;
}
else if(k<=l[l[x].lson].siz){
return query(l[x].lson,k);
}
else{
return query(l[x].rson,k-l[l[x].lson].siz-1);
}
}
int main(){
srand(114514);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>l[i].val;
l[i].id=i;
rt[i]=i;
fa[i]=i;
l[i].key=rand();
l[i].siz=1;
}
while(m--){
cin>>u>>v;
check(u,v);
}
cin>>m;
while(m--){
cin>>c>>u>>v;
if(c=='Q'){
int f=rt[findf(u)];
cout<<query(f,v)<<endl;
}
else{
check(u,v);
}
}
return 0;
}