```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,q,p[100005],pp[100005],id[100005],fa[100005],cnt[100005],tot=0;
int sm[25*100005],ls[25*100005],rs[25*100005];
char op[15];
void build(int x,int l,int r,int u)
{
if(l==r)
{
sm[x]=1;
return;
}
int mid=l+r>>1;
if(u<=mid)
{
ls[x]=++tot;
build(ls[x],l,mid,u);
sm[x]=sm[ls[x]];
}else
{
rs[x]=++tot;
build(rs[x],mid+1,r,u);
sm[x]=sm[rs[x]];
}
}
void merg(int x,int y,int l,int r)
{
if(l==r)return;
int mid=l+r>>1;
if(ls[x]&&ls[y])merg(ls[x],ls[y],l,mid);
else if(ls[y])ls[x]=ls[y];
if(rs[x]&&rs[y])merg(rs[x],rs[y],mid+1,r);
else if(rs[y])rs[x]=rs[y];
sm[x]=0;
if(ls[x])sm[x]+=sm[ls[x]];
if(rs[x])sm[x]+=sm[rs[x]];
}
int findfather(int x)
{
if(x==fa[x])return x;
int f=findfather(fa[x]);
fa[x]=f;
cnt[f]+=cnt[x],cnt[x]=0;
return fa[x];
}
void merp(int u,int v)
{
if(findfather(u)==findfather(v))return;
merg(id[fa[u]],id[fa[v]],1,n);
fa[fa[v]]=fa[u];
cnt[fa[u]]+=cnt[fa[v]],cnt[fa[v]]=0;
}
int query(int x,int l,int r,int k)
{
if(l==r)return l;
int mid=l+r>>1;
if(!ls[x])return query(rs[x],mid+1,r,k);
if(sm[ls[x]]<k)return query(rs[x],mid+1,r,k-sm[ls[x]]);
return query(ls[x],l,mid,k);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",&p[i]),pp[p[i]]=i;
for(int i=1;i<=n;i++)fa[i]=i,cnt[i]=1;
for(int i=1;i<=n;i++)
{
id[i]=++tot;
build(id[i],1,n,p[i]);
}
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
merp(u,v);
}
cin>>q;
while(q--)
{
scanf("%s",op+1);
if(op[1]=='Q')
{
int x,k;
scanf("%d%d",&x,&k);
if(cnt[findfather(x)]<k)
{
printf("-1\n");
continue;
}
int ans=pp[query(id[fa[x]],1,n,k)];
printf("%d\n",ans);
}else if(op[1]=='B')
{
int u,v;
scanf("%d%d",&u,&v);
merp(u,v);
}
}
return 0;
}
```
by lqyc @ 2021-08-10 11:25:24