并查集+线段树合并求调
查看原帖
并查集+线段树合并求调
1062683
lottle1212__楼主2024/8/10 22:08

Code WA 0pts

#include <iostream>
#include <bitset>
#include <algorithm>
#include <string.h>
#include <iomanip>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define ll long long
#define db double
#define L(i, j, k) for (int i=(j); i<=(k); ++i)
#define R(i, j, k) for (int i=(j); i>=(k); --i)
#define pii pair <int, int>
#define vi vector <int>
#define eb emplace_back
#define pb push_back
#define sz(x) ((int) x.size())
#define ms(f, x) memset(f, x, sizeof (f))
#define ACN(i, h_u) for (int i=h_u; i; i=e[i].nxt)
using namespace std;
template <typename INT> void rd(INT &res) {
	res=0; bool f=false; char ch=getchar();
	while (ch<'0'||ch>'9') f|=(ch=='-'), ch=getchar();
	while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^48), ch=getchar();
	res=(f?-res:res);
}
template <typename INT, typename ...Args>
void rd(INT &res, Args &..._res) { rd(res), rd(_res...); }
char get_opt() {
	char ch=getchar();
	while (ch!='B'&&ch!='Q') ch=getchar();
	return ch;
}
//clb
const int maxn=3e5;
const int N=maxn+10;
int sz[N], f[N], n, m, _p[N], p[N], idx, rt[N];
//wmr
#define ls(p) (t[p].ls)
#define rs(p) (t[p].rs)
#define s(p) (t[p].cnt)
struct SegmentTree { int ls, rs, cnt; } t[N<<6];
void pushup(int p) { s(p)=s(ls(p))+s(rs(p)); }
void update(int &p, int l, int r, int x, int k) {
	if (!p) p=++idx;
	++t[p].cnt;
	if (l==r) return ;
	int mid=l+r>>1;
	if (x<=mid) update(ls(p), l, mid, x, k);
	else update(rs(p), mid+1, r, x, k);
	pushup(p);
}
int query(int p, int l, int r, int k) {
	if (l==r) return l;
	int mid=l+r>>1;
	if (k<=s(ls(p))) return query(ls(p), l, mid, k);
	else return query(rs(p), mid+1, r, k-s(ls(p)));
}
int merge(int x, int y, int l, int r) {
	if (!x||!y) return x+y;
	if (l==r) { s(x)+=s(y); return x; }
	int mid=l+r>>1;
	ls(x)=merge(ls(x), ls(y), l, mid);
	rs(x)=merge(rs(x), rs(y), mid+1, r);
	return pushup(x), x;
}
int get_fa(int x) { return x==f[x]?x:f[x]=get_fa(f[x]); }
void merge_(int x, int y) {
	x=get_fa(x), y=get_fa(y);
	if (x!=y) sz[y]+=sz[x], f[x]=y, rt[y]=merge(rt[x], rt[y], 1, n);
}
//incra

//lottle
signed main() {
//	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen(".in", "r", stdin);
//	freopen("P3224.out", "w", stdout);
	rd(n, m);
	L(i, 1, n) rd(p[i]), _p[p[i]]=i, sz[i]=1, f[i]=i, update(rt[i], 1, n, p[i], 1);
	while (m--) { int u, v; rd(u, v); merge_(u, v); }
	int q; rd(q);
	while (q--) {
		int x, y;
		if (get_opt()=='Q') rd(x, y), printf("%d\n", (sz[get_fa(x)]>=y?_p[query(rt[x], 1, n, y)]:-1));
		else rd(x, y), merge_(x, y);
	}
	return 0;
}
2024/8/10 22:08
加载中...