写的可持久化线段树+路径压缩,不明白为什么会Wa,求大佬指点迷津
#include <bits/stdc++.h>
using namespace std;
namespace Slongod{
const int MAXN = 4e6+7;
int n , m , cnt;
//可持久化线段树
int head[MAXN];
struct TREE{int ls , rs , val;}tree[MAXN];
int copyfrom(int ro){cnt++; tree[cnt] = tree[ro]; return cnt;}
int build(int l , int r)
{
cnt++; int ro = cnt;
if (l >= r){tree[ro].val = l;}
else{int mid = (r - l) / 2 + l;
tree[ro].ls = build(l , mid);
tree[ro].rs = build(mid+1 , r);}
return ro;
}
void update(int ro , int lt , int rt , int x , int y)
{
if (lt >= rt)
{
tree[ro].val = y;
return;
} int mid = (rt - lt) / 2 + lt;
if (x <= mid)
tree[ro].ls = copyfrom(tree[ro].ls) , update(tree[ro].ls , lt , mid , x , y);
else
tree[ro].rs = copyfrom(tree[ro].rs) , update(tree[ro].rs , mid+1 , rt , x , y);
}
int find(int ro , int lt , int rt , int x , int root)
{
if (lt >= rt)
return tree[ro].val == lt ? lt : tree[ro].val = find(root , 1 , n , tree[ro].val , root);
int mid = (rt - lt) / 2 + lt;
if (x <= mid) return find(tree[ro].ls , lt , mid , x , root);
else return find(tree[ro].rs , mid+1 , rt , x , root);
}
void merge(int x , int y , int root)
{
int fx = find(root , 1 , n , x , root);
int fy = find(root , 1 , n , y , root);
if (fx != fy) update(root , 1 , n , fx , fy);
}
int main()
{
cin >> n >> m;
head[0] = build(1 , n);
for (int i = 1; i <= m; i++)
{
int opt; cin >> opt;
if (opt == 1)
{
head[i] = copyfrom(head[i-1]);
int a , b; cin >> a >> b;
merge(a , b , head[i]);
}
else if (opt == 2)
{
int k; cin >> k;
head[i] = copyfrom(head[k]);
}
else
{
head[i] = copyfrom(head[i-1]);
int a , b; cin >> a >> b;
int fx = find(head[i] , 1 , n , a , head[i]);
int fy = find(head[i] , 1 , n , b , head[i]);
if (fx == fy) cout << 1 << '\n';
else cout << 0 << '\n';
}
}
return 0;
}
}int main()
{
#ifndef ONLINE_JUDGE
freopen("P3402_7.in" , "r" , stdin);
freopen("out.out" , "w" , stdout);
#endif
ios :: sync_with_stdio(0);
cin.tie(0) , cout.tie(0);
return Slongod :: main();
}