| 记录编号 | 593717 | 评测结果 | AAAAAAAAAA | 
    
        | 题目名称 | 2089.平凡的测试数据 | 最终得分 | 100 | 
    
        | 用户昵称 |  小金 | 是否通过 | 通过 | 
    
        | 代码语言 | C++ | 运行时间 | 0.691 s | 
    
        | 提交时间 | 2024-09-10 19:36:20 | 内存使用 | 4.50 MiB | 
    
    
    
    		显示代码纯文本
		
		#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[300010],f[300010],ans[300010];//ans[i]表示i到f[i]路径上所有点权值的异或和(包括点i和f[i]) 
int find(int x)
{
    if(f[x]==x) return x;
    int p=find(f[x]);
    ans[x]=a[f[x]]^ans[x]^ans[f[x]];//x~f[x]^f[x]~p,f[x]会被消掉,所以再^a[f[x]] 
    f[x]=p;
    return f[x];
}
void merge(int x,int y)
{
    int fy=find(y);
    ans[x]=a[x]^ans[y];
    f[x]=fy;
}
int main()
{
    freopen("td.in","r",stdin);
    freopen("td.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        f[i]=i;
        ans[i]=a[i];
    } 
    for(int i=1;i<=m;i++)
    {
        int p;
        scanf("%d",&p);
        if(p==1)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            merge(x,y);
        }
        else
        {
            int x;
            scanf("%d",&x);
            find(x);
            printf("%d\n",ans[x]);
        }
    }
    return 0;
}