主席树 RE 70pts #2 #3 #6
查看原帖
主席树 RE 70pts #2 #3 #6
602803
_qingshu_楼主2024/6/3 09:52

我把 #2 下载下来在 windows 本地是可以跑过的.......

#include<bits/stdc++.h>
using namespace std;
int T,n,m,u,v,k,Fa[5200010][20],Dep[5200010],lastans,rt[5200010],tot;
int b[5200010],bn,a[5200010],siz[5200010],BF[5200010],q;
unordered_map<int,int>to;
vector<int>e[5200010];
struct edge{
	int lef,rig,lefson,rigson;
	int num;
}tr[50200010];
inline void build(int &id,int lef,int rig){
	id=++tot;tr[id].lef=lef;tr[id].rig=rig;
	if(lef==rig)return;
	build(tr[id].lefson,lef,(lef+rig)>>1);
	build(tr[id].rigson,((lef+rig)>>1)+1,rig);
}
inline void modify(int &id,int Lid,int fixid){
	if(tr[Lid].lef>fixid||tr[Lid].rig<fixid)return;
	id=++tot;tr[id]=tr[Lid];
	if(tr[id].lef==tr[id].rig){
		tr[id].num++;return;
	}
	modify(tr[id].lefson,tr[Lid].lefson,fixid);
	modify(tr[id].rigson,tr[Lid].rigson,fixid);
	tr[id].num=tr[tr[id].lefson].num+tr[tr[id].rigson].num;
}
inline void Modify(int id,int Lid,int fixid){
	tr[id].num=tr[Lid].num+1;
	if(tr[id].lef==tr[id].rig)return;
	int mid=(tr[id].lef+tr[id].rig)>>1;
	if(fixid>=mid+1)
		tr[id].lefson=tr[Lid].lefson,Modify(tr[id].rigson,tr[Lid].rigson,fixid);
	else
		tr[id].rigson=tr[Lid].rigson,Modify(tr[id].lefson,tr[Lid].lefson,fixid);
}
inline long long query(int u,int v,int lca,int Flca,int k){
	if(tr[u].lef==tr[u].rig)return tr[u].lef;
	long long now=tr[tr[u].lefson].num+tr[tr[v].lefson].num-
	              tr[tr[lca].lefson].num-tr[tr[Flca].lefson].num;
	if(now>=k)
		return query(tr[u].lefson,tr[v].lefson,tr[lca].lefson,tr[Flca].lefson,k);
	else 
		return query(tr[u].rigson,tr[v].rigson,tr[lca].rigson,tr[Flca].rigson,k-now);
}
inline void dfs1(int id,int fa){
	Dep[id]=Dep[fa]+1;Fa[id][0]=fa;
	for(int i=1;i<=__lg(Dep[id]);i++)Fa[id][i]=Fa[Fa[id][i-1]][i-1];
	modify(rt[id],rt[fa],to[a[id]]);
	for(int v : e[id])if(v!=fa)dfs1(v,id);
}
inline void dfs2(int id,int fa){
	Dep[id]=Dep[fa]+1;memset(Fa[id],0,sizeof Fa[id]);Fa[id][0]=fa;
	for(int i=1;i<=__lg(Dep[id]);i++)Fa[id][i]=Fa[Fa[id][i-1]][i-1];
	Modify(rt[id],rt[fa],to[a[id]]);
	for(int v : e[id])if(v!=fa)dfs2(v,id);
}
inline int findfa(int x){
	if(BF[x]!=x)BF[x]=findfa(BF[x]);
	return BF[x];
}
char op;
int main(){
//	freopen("P3302_2.in","r",stdin);
//	freopen("text.ans","w",stdout);
	cin>>T>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];b[i]=a[i];BF[i]=i;siz[i]=1;
	}Dep[0]=-1;
	stable_sort(b+1,b+n+1);
	bn=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++)if(!to[a[i]])to[a[i]]=lower_bound(b+1,b+bn+1,a[i])-b;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		e[u].emplace_back(v);
		e[v].emplace_back(u);
		siz[findfa(u)]+=siz[findfa(v)];
		BF[findfa(v)]=findfa(u);
	}
	build(rt[0],1,bn);
	for(int i=1;i<=n;i++)if(findfa(i)==i)dfs1(i,0);
	while(q--){
		cin>>op;
		if(op=='Q'){
			cin>>u>>v>>k;u^=lastans;v^=lastans;k^=lastans;
			long long Fu=u,Fv=v;
			if(Dep[Fu]<Dep[Fv])swap(Fu,Fv);
			for(int i=__lg(Dep[Fu]);i>=0;i--)
				if(Dep[Fa[Fu][i]]>Dep[Fv])Fu=Fa[Fu][i];
			if(Dep[Fu]!=Dep[Fv])Fu=Fa[Fu][0];
			for(int i=__lg(Dep[Fu]);i>=0;i--)
				if(Fa[Fu][i]!=Fa[Fv][i])Fu=Fa[Fu][i],Fv=Fa[Fv][i];
			if(Fu!=Fv)Fu=Fa[Fu][0],Fv=Fa[Fv][0];
			cout<<(lastans=b[query(rt[u],rt[v],rt[Fu],rt[Fa[Fu][0]],k)])<<"\n";
		}
		else{
			cin>>u>>v;
			u^=lastans;v^=lastans;
			e[u].emplace_back(v);
			e[v].emplace_back(u);
			if(siz[findfa(u)]<siz[findfa(v)])swap(u,v);
			siz[findfa(u)]+=siz[findfa(v)];
			BF[findfa(v)]=findfa(u);dfs2(v,u);
		}
	}
}
2024/6/3 09:52
加载中...