#include <iostream> #include <cstdio> #include <string.h> #include <vector> using namespace std; int n,m; pair<int,int> queries[100011]; int qL=0; vector< pair< pair<int,int>,int > > wanted[100011]; int answers[100011]; int father[100011]; int Find(int ver) { if (father[ver]==0) return ver; else { father[ver]=Find(father[ver]); return father[ver]; } } int main() { int i,j; int cm; int x,y; int counter=0; int L=0; int r1,r2; scanf("%d %d",&n,&m); for (i=1;i<=m;i++) { scanf("%d",&cm); if (cm==1) { scanf("%d %d",&x,&y); qL++; queries[qL]=make_pair(x,y); counter++; } else if (cm==2) { scanf("%d",&x); counter-=x; } else { scanf("%d %d",&x,&y); L++; wanted[counter].push_back( make_pair( make_pair(x,y),L ) ); } } for (i=0;i<wanted[0].size();i++) { if ( wanted[0][i].first.first==wanted[0][i].first.second ) answers[ wanted[0][i].second ]=1; else answers[ wanted[0][i].second ]=0; } for (i=1;i<=qL;i++) { r1=Find(queries[i].first); r2=Find(queries[i].second); if (r1!=r2) { father[r1]=r2; } for (j=0;j<wanted[i].size();j++) { r1=Find( wanted[i][j].first.first ); r2=Find( wanted[i][j].first.second ); if (r1==r2) answers[ wanted[i][j].second ]=1; else answers[ wanted[i][j].second ]=0; } } for (i=1;i<=L;i++) { printf("%d\n",answers[i]); } return 0; }