记录编号 432796 评测结果 AAAAAAAAAA
题目名称 [BZOJ 3674] 可持久化并查集加强版 最终得分 100
用户昵称 GravatarCooook 是否通过 通过
代码语言 C++ 运行时间 0.466 s
提交时间 2017-08-03 20:09:49 内存使用 62.09 MiB
显示代码纯文本
#include <stdio.h>
#include <cmath>
#include <cstring>
const int MAXN = 200005;
int n,m,deep[MAXN*20],cnt,fa[MAXN*20],Ans,root[MAXN];


template<typename _t>
inline _t read(){
    _t x=0,f=1;
    char ch=getchar();
    for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-f;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+(ch^48);
    return x*f;
}

inline void swap(int &a,int &b){a^=b;b^=a;a^=b;}
struct node{
    int l,r;
}tree[MAXN*20];

#define l(x) tree[x].l
#define r(x) tree[x].r

inline void build(int &o,int l,int r){
    o=++cnt;
    if(l==r){fa[o]=l;return;}
    int m=l+r>>1;
    build(l(o),l,m);
    build(r(o),m+1,r);
}

inline void insert(int &o,int old,int l,int r,int pos,int val){
    o=++cnt;
    tree[o]=tree[old];
    if(l==r){fa[o]=val;deep[o]=deep[old];return;}
    int m = l+r>>1;
    if(pos<=m)insert(l(o),l(old),l,m,pos,val);
    else insert(r(o),r(old),m+1,r,pos,val);
    return;
}

inline int Query(int o,int l,int r,int pos){
    if(l==r)return o;
    int m=l+r>>1;
    if(pos<=m)return Query(l(o),l,m,pos);
    else return Query(r(o),m+1,r,pos);
}

inline void Update(int o,int l,int r,int pos){
    if(l==r){++deep[o];return;}
    int m=l+r>>1;
    if(pos<=m)Update(l(o),l,m,pos);
    else Update(r(o),m+1,r,pos);
}

int find(int id,int x){
    int f = Query(root[id],1,n,x);
    if(fa[f]==x)return f;
    return find(id,fa[f]);
}

int main(){
    freopen("bzoj_3974.in","r",stdin);
    freopen("bzoj_3974.out","w",stdout);
    n=read<int>();m=read<int>();
    build(root[0],1,n);
    for(int i=1;i<=m;i++){
        int op = read<int>();
        if(op==1){
            root[i]=root[i-1];
            int u=read<int>()^Ans,v=read<int>()^Ans;
            u=find(i,u);v=find(i,v);
            if(fa[u]==fa[v]){continue;}
            if(deep[fa[u]]<deep[fa[v]])swap(u,v);
            insert(root[i],root[i-1],1,n,fa[v],fa[u]);
            if(deep[u]==deep[v])Update(root[i],1,n,fa[u]);
        }
        if(op==2){  
            int k=read<int>()^Ans;
            root[i]=root[k];
        }
        if(op==3){
            root[i]=root[i-1];
            int u=read<int>()^Ans,v=read<int>()^Ans;
            u=find(i,u);v=find(i,v);
            Ans=(u==v);
            printf("%d\n",Ans);
        }
    }
}