我的这个代码里的to_union()函数里的tx<ty改成大于就T了,不应该是把深度小的接在深度大的下面吗¿还是哪里写错了
#include <cstdio>
#define swap(A, B) (A ^= B ^= A ^= B)
const int MX = 100010, MXM = 200010, MXND = 10800010;
int read()
{
char c = getchar();
while (c < '0' or '9' < c)
{
c = getchar();
}
int ret = 0;
while ('0' <= c and c <= '9')
{
ret = (ret << 3) + (ret << 1) + c - '0';
c = getchar();
}
return ret;
}
void write(int num)
{
if (num >= 10)
{
write(num / 10);
}
putchar(num % 10 + '0');
}
struct p_arr
{
private:
struct node
{
int ls, rs;
};
static node tree[MXND];
static int len, tot;
int v[MXM], now;
static int update(int p, int x, int val, int cl = 1, int cr = len)
{
if (cl == cr)
{
tree[++tot].rs = val;
return tot;
}
else
{
int mid = (cl + cr) >> 1, ret = ++tot;
if (x <= mid)
{
tree[ret].ls = update(tree[p].ls, x, val, cl, mid);
tree[ret].rs = tree[p].rs;
}
else
{
tree[ret].ls = tree[p].ls;
tree[ret].rs = update(tree[p].rs, x, val, mid + 1, cr);
}
return ret;
}
}
static int query(int p, int x, int cl = 1, int cr = len)
{
if (cl == cr)
{
return tree[p].rs;
}
else
{
int mid = (cl + cr) >> 1;
if (x <= mid)
{
return query(tree[p].ls, x, cl, mid);
}
else
{
return query(tree[p].rs, x, mid + 1, cr);
}
}
}
public:
static void initl(int l)
{
len = l;
}
static int build(int p, int l, int r, int a(int))
{
if (l == r)
{
tree[p].rs = a(l);
}
else
{
int mid = (l + r) >> 1;
tree[p].ls = ++tot;
build(tot, l, mid, a);
tree[p].rs = ++tot;
build(tot, mid + 1, r, a);
}
}
void set(int idx, int val)
{
v[now] = update(v[now], idx, val);
}
void setv(int idx, int from)
{
now = idx;
v[idx] = v[from];
}
int operator[] (int idx)
{
return query(v[now], idx);
}
} fa, dep;
int p_arr::len, p_arr::tot;
p_arr::node p_arr::tree[MXND];
void init(int p, int n)
{
p_arr::build(p, 1, n, [] (int idx)
{
return idx;
});
}
int find(int x)
{
int fath = fa[x];
if (fath == x)
{
return x;
}
else
{
return find(fath);
}
}
bool in_union(int a, int b)
{
return find(a) == find(b);
}
void to_union(int a, int b)
{
int x = find(a), y = find(b);
if (x != y)
{
int tx = dep[x], ty = dep[y];
if (tx < ty)
{
swap(x, y);
}
fa.set(x, y);
if (tx == ty)
{
dep.set(y, ty + 1);
}
}
}
int main()
{
int n, m, op, a, b;
n = read();
m = read();
p_arr::initl(n);
init(0, n);
for (int i = 1; i <= m; i++)
{
op = read();
fa.setv(i, i - 1);
dep.setv(i, i - 1);
if (op == 1)
{
a = read();
b = read();
to_union(a, b);
}
else if (op == 2)
{
a = read();
fa.setv(i, a);
dep.setv(i, a);
}
else
{
a = read();
b = read();
putchar(in_union(a, b) ? '1' : '0');
putchar('\n');
}
}
}