HELP!
  • 板块学术版
  • 楼主Maxuejun
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/10 10:38
  • 上次更新2023/11/3 04:47:46
查看原帖
HELP!
935711
Maxuejun楼主2023/8/10 10:38

题目传送门

//样例都过不了的115行屎山代码
//求巨佬调一调
#include<bits/stdc++.h>
using namespace std;
int n,m,tot,q,Q;
int idd[1000010];
int rt[1000010];
int fa[1000010];
struct node{
	int ls;
	int rs;
	int w;
}t[100000010];
int find(int f){
	if(fa[f]==f){
		return f;
	}
	else{
		fa[f]=find(fa[f]);
		return fa[f];
	}
}
int Build(int l,int r,int f){
	int o=++tot;
	if(l==r){
		t[o].w+=1;
		return o;
	}
	int m=(l+r)/2;
	if(f<=m){
		t[o].ls=(l,m,f);
	}
	else{
		t[o].rs=(m+1,r,f);
	}
	t[o].w=t[t[o].ls].w+t[t[o].rs].w;
	return o;
}
int Update(int fv,int fu,int l,int r){
	if(fv==0){
		return fu;
	}
	if(fu==0){
		return fv;
	}
	if(l==r){
		t[fv].w+=t[fu].w;
		return fv;
	}
	int m=(l+r)/2;
	t[fv].ls=Update(t[fv].ls,t[fu].ls,l,m);
	t[fv].rs=Update(t[fv].rs,t[fu].rs,m+1,r);
	t[fv].w=t[t[fv].ls].w+t[t[fv].rs].w;
	return fv;
}
int Query(int o,int l,int r,int v){
	if(l==r){
		return l;
	}
	int m=(l+r)/2;
	int lsum=t[t[o].ls].w;
	if(v<=lsum){
		return Query(t[o].ls,l,m,v);
	}
	else{
		return Query(t[o].rs,m+1,r,v-lsum);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&q);
		idd[q]=i;
		rt[i]=Build(1,n,q);
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		int fu=find(fa[u]);
		int fv=find(fa[v]);
		if(fu==fv){
			continue;
		}
		fa[fu]=fv;
		rt[fv]=Update(rt[fv],rt[fu],1,n);
	}
	scanf("%d",&Q);
	for(int i=1;i<=Q;i++){
		char s[10];
		scanf("%s",s);
		if(s[0]=='B'){
			int u,v;
			scanf("%d%d",&u,&v);
			int fu=find(fa[u]);
		    int fv=find(fa[v]);
		    if(fu==fv){
			    continue;
		    }
		    fa[fu]=fv;
		    rt[fv]=Update(rt[fv],rt[fu],1,n);
		}
		else{
			int u,v;
			scanf("%d%d",&u,&v);
			int fu=find(u);
			if(t[rt[fu]].w<v){
				printf("-1\n");
			}
			else{
				int k=Query(rt[fu],1,n,v);
				printf("%d\n",idd[k]);
			}
		}
	}
	return 0;
}
2023/8/10 10:38
加载中...