/* */ //#pragma comment(linker, "/STACK:16777216") #include <fstream> #include <iostream> #include <string> #include <complex> #include <math.h> #include <set> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <stack> #include <algorithm> #include <list> #include <ctime> #include <memory.h> #include <ctime> #define y0 sdkfaslhagaklsldk #define y1 aasdfasdfasdf #define yn askfhwqriuperikldjk #define j1 assdgsdgasghsf #define tm sdfjahlfasfh #define lr asgasgash #define eps 1e-9 //#define M_PI 3.141592653589793 #define bs 2717401869ll #define bsize 256 #define right adsgasgadsg #define free adsgasdg #define MAG 10000 using namespace std; long n,m,tp,a,b; vector<long> events; long w[1<<20],d[1<<20]; vector<pair<long, pair<long, long> > > mem[1<<20]; long tt; long get(long x) { if (x==w[x]) return x; return get(w[x]); } int main(){ //freopen("evacuation.in","r",stdin); //freopen("evacuation.out","w",stdout); //freopen("C:/input.txt","r",stdin); //freopen("C:/output.txt","w",stdout); //ios_base::sync_with_stdio(0); //cin.tie(0); scanf("%ld%ld",&n,&m); //cin>>n>>m; for (int i=1;i<=n;i++) w[i]=i; for (int i=1;i<=m;i++) { // cin>>tp; mem[i].reserve(8); scanf("%ld",&tp); if (tp==3) { // cin>>a>>b; scanf("%ld%ld",&a,&b); if (get(a)==get(b)) puts("1"); else puts("0"); // else cout<<0<<"\n";//endl; } if (tp==1) { // cin>>a>>b; scanf("%ld%ld",&a,&b); events.push_back(i); long aa,bb; aa=get(a); bb=get(b); if (aa==bb)continue; a=aa; b=bb; if (d[a]>d[b]) swap(a,b); w[a]=b; mem[i].push_back(make_pair(1,make_pair(a,b))); if (d[a]==d[b]) mem[i].push_back(make_pair(2,make_pair(b,b))); } if (tp==2) { scanf("%ld",&a); for (;a;--a) { tt=events.back(); events.pop_back(); for (int j=0;j<mem[tt].size();j++) { if (mem[tt][j].first==1) { w[mem[tt][j].second.first]=mem[tt][j].second.first; } else d[mem[tt][j].second.first]--; } } } } cin.get();cin.get(); return 0;}