差点就撸上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 ",ans); } } return 0; }