rt。 开的都是静态空间,为什么别的点没有mle,只有这个点会mle。
#include <iostream>
namespace tree
{
#define mid ((l + r) >> 1)
#define lson l, mid
#define rson mid + 1, r
const int MAGIC = 2e5 * 45;
struct P
{
int p, h, ls, rs;
} tr[MAGIC] = {{0, 0, 0, 0}};
int n, sz = 1;
int N(int p, int h, int ls, int rs)
{
tr[sz] = {p, h, ls, rs};
return sz++;
}
int set(int o, int x, int p, int h, int l = 1, int r = n)
{
if (x < l || x > r)
return o;
if (l == r)
return N(p, h, 0, 0);
return N(-1, -1, set(tr[o].ls, x, p, h, lson), set(tr[o].rs, x, p, h, rson));
}
auto get(int o, int x, int l = 1, int r = n)
{
if (l == r)
return std::make_pair(tr[o].p, tr[o].h);
if (x <= mid)
return get(tr[o].ls, x, lson);
else
return get(tr[o].rs, x, rson);
}
auto root(int o, int x)
{
auto p = get(o, x);
while (x != p.first)
{
x = p.first;
p = get(o, x);
}
return p;
}
} // namespace tree
int ver[200001];
void Solve()
{
int N, M;
std::cin >> N >> M;
tree::n = N;
for (int i = 1; i <= N; i++)
{
ver[0] = tree::set(ver[0], i, i, 0);
}
for (int q = 1; q <= M; q++)
{
int opt, a, b, k;
std::cin >> opt;
if (opt == 2)
std::cin >> k;
else
std::cin >> a >> b;
if (opt == 1)
{
int o = ver[q - 1];
auto [ra, ha] = tree::root(o, a);
auto [rb, hb] = tree::root(o, b);
if (ha > hb)
{
std::swap(ra, rb);
std::swap(ha, hb);
}
o = tree::set(o, ra, rb, -1);
o = tree::set(o, rb, rb, std::max(ha + 1, hb));
ver[q] = o;
}
else if (opt == 2)
{
ver[q] = ver[k];
}
else if (opt == 3)
{
ver[q] = ver[q - 1];
std::cout << (tree::root(ver[q], a) == tree::root(ver[q], b)) << '\n';
}
}
}
signed main()
{
std::cin.tie(0)->std::ios::sync_with_stdio(0);
std::cin.exceptions(std::cin.failbit);
Solve();
}