1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| const int MAXN=1e5+10; int N,M,Q; int Idx=0,Rt; int x,y,z; struct Fhq { int val,rd,siz,id,chi[2]; }Tr[MAXN]; #define ls(p) Tr[p].chi[0] #define rs(p) Tr[p].chi[1] int Fa[MAXN],rt[MAXN]; inline int newNode(int v,int i) { Tr[++Idx]=(Fhq){v,rand(),1,i}; return Idx; } inline void upDate(int p) { Tr[p].siz=Tr[ls(p)].siz+Tr[rs(p)].siz+1; } inline void split(int p,int k,int &u,int &v) { if(!p) u=v=0; else { if(Tr[p].val<=k) u=p,split(rs(u),k,rs(u),v); else v=p,split(ls(v),k,u,ls(v)); upDate(p); } } inline int merge(int u,int v) { if(!u||!v) return u+v; if(Tr[u].rd<Tr[v].rd) { rs(u)=merge(rs(u),v); return upDate(u),u; } else { ls(v)=merge(u,ls(v)); return upDate(v),v; } } inline void init(int n) { for(int i=1;i<=n;++i) Fa[i]=i; } int getFa(int x) { return Fa[x]==x?x:Fa[x]=getFa(Fa[x]); } inline bool check(int &x,int &y) { x=getFa(x),y=getFa(y); return x==y; } void dfs(int x,int &tar) { if(!x) return ; dfs(ls(x),tar),dfs(rs(x),tar); ls(x)=rs(x)=0; Tr[x].siz=1; int rt1,rt2; split(tar,Tr[x].val,rt1,rt2); tar=merge(rt1,merge(x,rt2)); } inline void mergeSet(int x,int y) { if(check(x,y)) return ; if(Tr[rt[x]].siz>Tr[rt[y]].siz) std::swap(x,y); Fa[x]=y; dfs(rt[x],rt[y]); } inline int kth(int u,int k) { while(1) { if(k<=Tr[ls(u)].siz) u=ls(u); else if(k==Tr[ls(u)].siz+1) return Tr[u].id; else k-=Tr[ls(u)].siz+1,u=rs(u); } } char opt[2]; int main() { read(N,M); init(N); for(int i=1,x;i<=N;++i) { read(x);rt[i]=newNode(x,i); } for(int i=1,u,v;i<=M;++i) { read(u,v);mergeSet(u,v); } read(Q); for(int u,v;Q--;) { scanf("%s",opt+1);read(u,v); if(opt[1]=='Q') { u=getFa(u); if(Tr[rt[u]].siz<v) { puts("-1"); continue; } write(kth(rt[u],v)),puts(""); } else mergeSet(u,v); } return 0; }
|