求助,玄关
查看原帖
求助,玄关
674967
xz001楼主2025/1/20 10:10

只对了 #7

#include <bits/stdc++.h> 

#define int long long

using namespace std;

const int N = 2e5 + 5;

struct node {
	int ls, rs, sum, siz;
};

node t[4 * N];

int n, m, rt[N], idx;

int build (int l, int r) {
	int p = ++ idx;
	t[p].sum = l;
	if (l == r) return p;
	int mid = (l + r) >> 1;
	t[p].ls = build (l, mid);
	t[p].rs = build (mid + 1, r);
	return p;
}

int query1 (int l, int r, int p, int x) {
	if (l == r) return t[p].sum;
	int mid = (l + r) >> 1;
	if (x <= mid) return query1 (l, mid, t[p].ls, x);
	return query1 (mid + 1, r, t[p].rs, x);
}

int query2 (int l, int r, int p, int x) {
	if (l == r) return t[p].sum;
	int mid = (l + r) >> 1;
	if (x <= mid) return query2 (l, mid, t[p].ls, x);
	return query2 (mid + 1, r, t[p].rs, x);
}

int fz (int p) {
	t[ ++ idx] = t[p];
	return idx;
}

int update1 (int l, int r, int p, int x, int y) {
	p = fz(p);
	t[p].sum = y;
	if (l == r) return p;
	int mid = (l + r) >> 1;
	if (x <= mid) t[p].ls = update1 (l, mid, t[p].ls, x, y);
	else t[p].rs = update1 (mid + 1, r, t[p].rs, x, y); 
	return p;
}

int update2 (int l, int r, int p, int x, int y) {
	p = fz(p);
	t[p].siz += y;
	if (l == r) return p;
	int mid = (l + r) >> 1;
	if (x <= mid) t[p].ls = update2 (l, mid, t[p].ls, x, y);
	else t[p].rs = update2 (mid + 1, r, t[p].rs, x, y); 
	return p;
}

int find (int x, int p) {
	return x == query1 (1, 1e5, p, x) ? x : find(query1 (1, 1e5, p, x), p);
}

signed main() {
	scanf("%lld%lld", &n, &m);
	rt[0] = build (1, 1e5);
	for (int i = 1; i <= m; ++ i ) {
		int op, a, b, k;
		scanf("%lld", &op);
		if (op == 1) {
			scanf("%lld%lld", &a, &b);
			int x = find(a, rt[i - 1]), y = find(b, rt[i - 1]);
			if (query2 (1, 1e5, rt[i - 1], x) < query2 (1, 1e5, rt[i - 1], y)) {
				swap(x, y);
			}
			rt[i] = update2 (1, 1e5, rt[i - 1], x, query2 (1, 1e5, rt[i - 1], y));
			rt[i] = update1 (1, 1e5, rt[i], y, x);
		} else if (op == 2) {
		    scanf("%lld", &k);
		    rt[i] = rt[k];
		} else {
			scanf("%lld%lld", &a, &b);
			rt[i] = rt[i - 1];
			if (query1 (1, 1e5, rt[i], a) == query1 (1, 1e5, rt[i], b)) {
				puts("1");
			} else {
				puts("0");
			}
		}
	}
	return 0;
}
2025/1/20 10:10
加载中...