#include using namespace std; int timer = 0; int Parent[200000], Rank[200000]; pair Ops[200000]; char c; int Find(int a) { while(Parent[a]) a = Parent[a]; return a; } void Union(int a, int b) { timer += 1; a = Find(a); b = Find(b); if(a == b) { Ops[timer] = {0, 0}; } else { if(Rank[a] > Rank[b]) swap(a, b); Rank[b] += (Rank[a] == Rank[b]); Ops[timer] = {a, Parent[a]}; Parent[a] = b; } } void Undo() { Parent[Ops[timer].first] = Ops[timer].second; timer -= 1; } void Read(int &a) { for(c = getchar(); !isdigit(c); c = getchar()); for(a = 0; isdigit(c); c = getchar()) a = (a << 1) + (a << 3) + c - '0'; } int main() { int n, m, a, b, t; Read(n); Read(m); while(m --) { Read(t); if(t == 1) { Read(a); Read(b); Union(a, b); } if(t == 2) { Read(a); for(int i = 1; i <= a; i += 1) Undo(); } if(t == 3) { Read(a); Read(b); cout << (Find(a) == Find(b)) << '\n'; } } return 0; }