……按秩合并的并查集高度是log的,直接暴力走就是了
#include<bits/stdc++.h>
#define MAXN 500005
using namespace std; int n,m;
inline int read(){
register char ch = getchar();
while(!isdigit(ch)) ch = getchar();
register int rtn = 0;
while(isdigit(ch)) rtn = rtn*10 + ch - '0' , ch = getchar();
return rtn;
}
int fth[MAXN],f[MAXN];
int siz[MAXN],dpt[MAXN];
int cnt_merge = 0;
int findfather(int x){
if(fth[x]==x) return x;
int k = findfather(fth[x]);
dpt[x] = dpt[fth[x]] +1;
return k;
}
inline void merge(int x,int y){
//printf("%d %d\n",x,y);
x = findfather(x) , y = findfather(y);
if(x==y) return void(++cnt_merge);
if(siz[x] > siz[y]) fth[y] = x , f[y] = ++cnt_merge , siz[x] += siz[y];
else fth[x] = y , f[x] = ++cnt_merge , siz[y] += siz[x];
}
inline int ask(int x,int y){
int fx = findfather(x) , fy = findfather(y);
if(fx^fy) return 0;
//printf("root = %d\n",fx);
int rtn = 0;
while(x^y){
if(dpt[x] > dpt[y]) rtn = max(rtn , f[x]) , x = fth[x];
else rtn = max(rtn,f[y]) , y = fth[y];
}
return rtn;
}
int opt,lastans,tmp;
int main(){
//freopen("1.in","r",stdin);
//freopen("orz.out","w",stdout);
n = read() , m = read();
for(int i=1;i<=n;++i) fth[i] = i , siz[i] = 1;
for(int i=1;i<=m;++i){
opt = read();
//int x = read()^lastans , y = read()^lastans;
int x = read() , y = read();
if(opt) printf("%d\n",tmp=ask(x^lastans,y^lastans)) , lastans = tmp;
else merge(x^lastans,y^lastans);
}
return 0;
}