#include <bits/stdc++.h> #define rep(i,x,y) for (int i = (x); i<=(y); i++) #define repe(i,x,y) for (int i = (x); i < (y);i++) #define drep(i,x,y) for (int i = (x); i >= (y); i--) #define mp make_pair #define pb push_back #define MAX(a,b) (((a)>(b))?(a):(b)) #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAXN 100100 #define sf(n) scanf("%Lf",&n) #define prf(n) printf("%Lf",n) #define s(n) scanf("%d",&n) #define sl(n) scanf("%lld",&n) #define pr(n) printf("%d",n) #define prl(n) printf("%lld",n) #define endc printf("\n") #define psp printf(" ") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; const int buffer=1<<13; char buff[buffer]; int cnt=0; int gi() { int x; s(x); return x; /*int number = 0; while(buff[cnt] < '0' || '9' < buff[cnt]) if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0; while('0' <= buff[cnt] && buff[cnt] <= '9') { number = number * 10 + buff[cnt] - '0'; if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0; } return number;*/ } vector<int> current; stack< vector<int> > S; typedef struct node { stack<int> A; int name; node() { } node(int name):name(name) { A = *new stack<int>(); A.push(-1); } int get() { return A.top(); } int undo() { A.pop(); } int set(int v) { A.push(v); S.top().pb(name); } } node; node Z[MAXN]; void unionS(int x,int y) { Z[x].set(y); } int findS(int x) { //cout<<x<<" : "<<Z[x].get()<<endl; if (Z[x].get() < 0) { return x; } int y = findS(Z[x].get()); Z[x].set(y); return y; } int main() { S = *new stack< vector<int> >(); int n = gi(), m = gi(); //cout<<n<<" "<<m<<endl; rep(i,1,n) { Z[i] = *new node(i); } while (m--) { int type = gi(); if (type == 1) { current.clear(); S.push(current); int x = gi(), y = gi(); int a = findS(x), b = findS(y); if (a != b) { unionS(a,b); } } else if (type == 2) { int x = gi(); while (x--) { vector<int> V = S.top(); S.pop(); repe(j,0,V.size()) { Z[V[j]].undo(); } } } else { int x = gi(), y = gi(); int a = findS(x), b = findS(y); pr(a==b ? 1 : 0); endc; } //cout<<"Ok"<<endl; } }