[COGS 2089.] 平凡的测试数据 带权并查集

差点就撸上LCT了.......

带权并查集就是在并查集的基础上稍作修改,我的用穿址实现的有人用记录原父亲来实现。

#include<cstdio>
#define N 300010
using namespace std;
inline int read()
{
   int sum=0;
   char ch=getchar();
   while(ch<'0'||ch>'9')ch=getchar();
   while(ch>='0'&&ch<='9')
   {
     sum=(sum<<1)+(sum<<3)+ch-'0';
     ch=getchar();
   }
   return sum;
}
int n,m,f[N],a[N];
int find(int x,int &y)
{
   if(x==f[x])return x;
   f[x]=find(f[x],y);
   y=a[x]^=y;
   return f[x];
}
int main()
{
   n=read(),m=read();
   for(int i=1;i<=n;i++)a[i]=read(),f[i]=i;
   while(m--)
   {
     int opt=read(),x=read(),y;
     if(opt==1) f[x]=read();
     else
     {
        find(x,y=0);
        int ans=(x==f[x])?a[x]:(a[x]^a[f[x]]);
        printf("%d\n",ans);
     }
   }
   return 0;
}

 

posted @ 2017-07-26 20:52  TS_Hugh  阅读(169)  评论(1编辑  收藏  举报