求助 孩子不会冰茶姬了

P3224 [HNOI2012] 永无乡

```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


|