主席树加并查集
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
int n, m, tot = 0, root[200006];
struct T {
int l, r, f, d;
}t[200006 << 5];
int build(int l, int r) {
int p = ++tot;
if (l == r) {
t[p].f = l;
t[p].d = 1;
return p;
}
int mid = (l + r) >> 1;
t[p].l = build(l, mid);
t[p].r = build(mid + 1, r);
return p;
}
int ask(int p, int l, int r, int x) {
while (l < r) {
int mid = (l + r) >> 1;
if (x <= mid) {
r = mid;
p = t[p].l;
}
else {
l = mid + 1;
p = t[p].r;
}
}
return p;
}
int add(int pre, int l, int r, int x) {
int p = ++tot;
if(l == r){
t[p].f = x;
t[p].d = t[pre].d + 1;
return p;
}
t[p].l = t[pre].l;
t[p].r = t[pre].r;
int mid = (l + r) >> 1;
if (x <= mid)t[p].l = add(t[pre].l, l, mid, x);
else t[p].r = add(t[pre].r, mid + 1, r, x);
return p;
}
int add(int pre, int l, int r, int s, int f) {
int p = ++tot;
if (l == r) {
t[p].f = f;
t[p].d = t[pre].d;
return p;
}
t[p].l = t[pre].l;
t[p].r = t[pre].r;
int mid = (l + r) >> 1;
if (s <= mid) t[p].l = add(t[pre].l, l, mid, s, f);
else t[p].r = add(t[pre].r, mid + 1, r, s, f);
return p;
}
int get(int p, int x) {
int k = ask(p, 1, n, x);
if (t[k].f == x) return k;
return get(p, t[k].f);
}
int main() {
cin >> n >> m;
root[0] = build(1, n);
int ans = 0, o, x, y;
for (int i = 1; i <= m; i++) {
root[i] = root[i - 1];
scanf("%d", &o);
if (o == 1) {
scanf("%d %d", &x, &y);
int rx = get(root[i], x ^= ans);
int ry = get(root[i], y ^= ans);
if (t[rx].f == t[ry].f) continue;
if (t[rx].d > t[ry].d) swap(rx, ry);
root[i] = add(root[i - 1], 1, n, t[rx].f, t[ry].f);
if (t[rx].d == t[ry].d)
root[i] = add(root[i], 1, n, t[ry].f);
}
else if (o == 2) {
scanf("%d", &x);
root[i] = root[x ^= ans];
}
else {
scanf("%d %d", &x, &y);
int rx = get(root[i], x ^= ans);
int ry = get(root[i], y ^= ans);
printf("%d\n", ans = rx == ry);
}
}
return 0;
}
/*
5 6
1 1 2
3 1 2
2 1
3 0 3
2 1
3 1 2
*/