1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
| #include <bits/stdc++.h>
#include "ybwhead/ios.h"
int n, m;
const int maxn = 2e5 + 10;
int tot;
int root[maxn];
struct T
{
int l, r, f, d;
} t[maxn << 5];
inline 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;
}
inline 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;
}
inline 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;
}
inline 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 gf(int rt, int x)
{
int k = ask(rt, 1, n, x);
if (t[k].f == x)
return k;
return gf(rt, t[k].f);
}
int main()
{
yin >> 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];
yin >> o;
if (o == 1)
{
yin >> x >> y;
int rx = gf(root[i], x);
int ry = gf(root[i], y);
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)
{
yin >> x;
root[i] = root[x];
}
else
{
yin >> x >> y;
int rx = gf(root[i], x);
int ry = gf(root[i], y);
yout << (ans = rx == ry) << endl;
}
}
}
|