/************************************************************** Problem: 2733 User: syh0313 Language: C++ Result: Accepted Time:2336 ms Memory:123988 kb ****************************************************************/ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cmath> #include <algorithm> #include <vector> #define lch a[n].lc #define rch a[n].rc #define pb push_back using namespace std; const int maxn=100010; int n,m,v[maxn],root[maxn],be[maxn],topt,id[maxn],nn[maxn],cnt; vector< int >now[maxn]; struct da{ int lc,rc,sum;}a[100*maxn]; inline void updata( int n){a[n].sum=a[lch].sum+a[rch].sum;} void tree_add( int &n, int l, int r, int lc) { if (!n) n=++topt; if (l==r) {a[n].sum++; return ;} int mid=(l+r)>>1; if (lc<=mid) tree_add(lch,l,mid,lc); else tree_add(rch,mid+1,r,lc); updata(n); } int qury( int n, int l, int r, int k) { if (l==r) return l; int mid=(l+r)>>1; if (a[lch].sum>=k) return qury(lch,l,mid,k); else return qury(rch,mid+1,r,k-a[lch].sum); } int main() { scanf ( "%d%d" ,&n,&m); for ( int i=1;i<=n;i++) scanf ( "%d" ,&v[i]),id[v[i]]=i,be[i]=i,now[i].pb(i); for ( int i=1;i<=m;i++) { int xx,yy; scanf ( "%d%d" ,&xx,&yy); if (be[xx]==be[yy]) continue ; if (now[be[xx]].size()<now[be[yy]].size()) { cnt=0; for ( int i=0;i<( int )now[be[xx]].size();i++) nn[++cnt]=now[be[xx]][i]; for ( int i=1;i<=cnt;i++) be[nn[i]]=be[yy],now[be[yy]].pb(nn[i]); } else { cnt=0; for ( int i=0;i<( int )now[be[yy]].size();i++) nn[++cnt]=now[be[yy]][i]; for ( int i=1;i<=cnt;i++) be[nn[i]]=be[xx],now[be[xx]].pb(nn[i]); } } for ( int i=1;i<=n;i++) if (now[i].size()>0) { for ( int j=0;j<( int )now[i].size();j++) tree_add(root[i],1,n,v[now[i][j]]);} scanf ( "%d" ,&m); while (m--) { char op[5]; int x,y; scanf ( "%s%d%d" ,op+1,&x,&y); if (op[1]== 'B' ) { if (now[be[x]].size()<now[be[y]].size()) { cnt=0; for ( int i=0;i<( int )now[be[x]].size();i++) nn[++cnt]=now[be[x]][i]; for ( int i=1;i<=cnt;i++) { be[nn[i]]=be[y]; now[be[y]].pb(nn[i]); tree_add(root[be[y]],1,n,v[nn[i]]); } } else { cnt=0; for ( int i=0;i<( int )now[be[y]].size();i++) nn[++cnt]=now[be[y]][i]; for ( int i=1;i<=cnt;i++) { be[nn[i]]=be[x]; now[be[x]].pb(nn[i]); tree_add(root[be[x]],1,n,v[nn[i]]); } } } else { if (a[root[be[x]]].sum<y) printf ( "-1\n" ); else { int k=qury(root[be[x]],1,n,y); printf ( "%d\n" ,id[k]); } } } return 0; } |