#include<bits/stdc++.h>
#define N 301000
using namespace std;
template<typename T>inline void read(T &x)
{
x = 0;
static int p; p = 1;
static char c; c = getchar();
while(!isdigit(c)){if(c == '-') p = -1;c = getchar();}
while(isdigit(c)) {x = (x<<1) + (x<<3) + (c-48); c=getchar();}
x *= p;
}
int n, m;
int L[N*30], R[N*30], fa[N*30], dep[N*30];
int root[N*30];
namespace Persistant_Union_Set
{
#define Mid ((l+r)>>1) //二分
#define lson L[rt],l,Mid //左子树
#define rson R[rt],Mid+1,r //右子树
int cnt;
void build(int &rt, int l, int r)
{//建树,初始化并查集
rt = ++cnt;
if(l == r) {fa[rt]=l; return;}
build(lson); build(rson);
}
void merge(int last, int &rt, int l, int r, int pos, int Fa)
{//把pos祖先更新为Fa
rt = ++cnt; L[rt] = L[last], R[rt] = R[last];
if(l == r){
fa[rt] = Fa;
dep[rt] = dep[last];
return;
}
if(pos <= Mid) merge(L[last], lson, pos, Fa);
else merge(R[last], rson, pos, Fa);
}
void update(int rt, int l, int r, int pos)
{
if(l == r){dep[rt]++; return;}
if(pos<=Mid) update(lson, pos);
else update(rson, pos);
}
int query(int rt, int l, int r, int pos)
{//查询pos在当前版本下在树中的编号
if(l == r) return rt;
if(pos <= Mid)return query(lson, pos);
else return query(rson, pos);
}
int find(int rt,int pos)
{//找到pos所在集合的公共祖先,递归实现
int now = query(rt, 1, n, pos);
if(fa[now] == pos) return now;
return find(rt, fa[now]);
}
#undef Mid
#undef lson
#undef rson
}
using namespace Persistant_Union_Set;
int main()
{
read(n);read(m);
build(root[0], 1, n);
for(int i = 1; i <= m; i++)
{
static int opt, x, y;
read(opt); read(x);
if(opt == 1) {
read(y);
root[i] = root[i-1];
posx = find(root[i], x); posy = find(root[i], y);
if(fa[posx] != fa[posy]){
if(dep[posx] > dep[posy]) swap(posx, posy);
merge(root[i-1], root[i], 1, n, fa[posx], fa[posy]);
if(dep[posx] == dep[posy]) update(root[i], 1, n, fa[posy]);//更新深度
}
}
else if(opt == 2) root[i] = root[x];
else if(opt == 3){
read(y);
root[i] = root[i-1];
posx = find(root[i],x); posy = find(root[i], y);
puts((fa[posx] == fa[posy]) ? "1" : "0");
}
}
return 0;
}
2019-05-06只是为了代码高亮好截屏好看
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。