萌新求助:样例随机WA
查看原帖
萌新求助:样例随机WA
159548
Zachary_Cloud楼主2022/7/8 21:09

RT. 萌新求调 ( ・´ω`・ )

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n,m,q,f[N],ys[N];
struct node {
	int l,r,size,val,key;
} tr[N];

inline void Add(int x,int y) {
	tr[x].val=y;
	tr[x].size=1;
	tr[x].key=rand();
	tr[x].l=tr[x].r=0;
}
inline void pushup(int u) {
	tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;
}
inline void Split(int u,int val,int &l,int &r) {
	if (!u) return void(l=r=0);
	if (tr[u].val<=val) {
		l=u,Split(tr[u].r,val,tr[l].r,r);
	} else {
		r=u,Split(tr[u].l,val,l,tr[r].l);
	}
	pushup(u);
}
inline int Merge(int l,int r) {
	if (!l||!r) return l+r;
	if (tr[l].key<tr[r].key) {
		tr[l].r=Merge(tr[l].r,r);
		pushup(l); return l;
	} else {
		tr[r].l=Merge(l,tr[r].l);
		pushup(r); return r;
	}
}
inline int kth(int u,int k) {
	if (tr[tr[u].l].size+1==k) return tr[u].val;
	else if (tr[tr[u].l].size>=k) return kth(tr[u].l,k);
	else return kth(tr[u].r,k-tr[tr[u].l].size-1);
}
inline int find(int x) {
	if (f[x]==x) return x;
	return f[x]=find(f[x]);
}
inline void dfs(int x,int y) {
	if (!x) return;
	dfs(tr[x].l,y); dfs(tr[x].r,y);
	tr[x].l=tr[x].r=0; tr[x].size=1;
	int t1,t2;
	Split(y,tr[x].val,t1,t2);
	y=Merge(Merge(t1,x),t2);
}
inline void merge(int x,int y) {
	x=find(x),y=find(y);
	if (x==y) return;
	if (tr[x].size>tr[y].size) swap(x,y);
	f[x]=y; dfs(x,y); 
}


inline void print(int u) {
	if (tr[u].l) print(tr[u].l);
	cout<<tr[u].val<<" ";
	if (tr[u].r) print(tr[u].r);
}

int main() {
	srand(time(0)); srand(rand()); srand(rand());
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for (int i=1;i<=n;++i) {
		int x; cin>>x; Add(i,x); f[i]=i; ys[x]=i;
	}
	for (int i=1;i<=m;++i) {
		int x,y; cin>>x>>y; merge(x,y);
	}
	cin>>q;
	for (int i=1;i<=q;++i) {
		char c; int x,y; cin>>c>>x>>y;
		if (c=='Q') {
			int t=find(x); //print(t); cout<<endl;
			cout<<(tr[t].size<y?-1:ys[kth(t,y)])<<endl;
		} else merge(x,y);
	}
	return 0;
}
2022/7/8 21:09
加载中...