只对了 #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;
}