#include #include //#include #define NMAX 100005 using namespace std; struct qu { int x,y; }v[NMAX]; int n,m,tip,k,x,y; int mul[NMAX]; vectorant[NMAX]; const int buffer=1<<13; char buff[buffer]; int cnt=0; int getInt() { 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; } void undo(int x,int y) { mul[x]=ant[x][ant[x].size() - 1]; mul[y]=ant[y][ant[y].size() - 1]; ant[x].erase(ant[x].end()-1); ant[y].erase(ant[y].end()-1); } int find(int i) { if (mul[i]==i) return i; ant[i].push_back(mul[i]); mul[i]=find(mul[i]); return mul[i]; } void reuneste(int i,int j) { mul[find(i)]=find(j); } int main() { n = getInt(); m = getInt(); //scanf("%d%d",&n,&m); for(int i = 1; i <= n; ++i) { mul[i] = i; ant[i].push_back(i); } for(int i = 1; i <= m; ++i) { //scanf("%d",&tip); tip = getInt(); if ( tip == 1) { ++k; v[k].x = getInt(); v[k].y = getInt(); reuneste(v[k].x,v[k].y); } if (tip == 3) { scanf("%d%d",&x,&y); x = getInt(); y = getInt(); if (find(x) == find(y)) printf("1\n"); else printf("0\n"); } if (tip == 2) { scanf("%d",&x); x = getInt(); for(int i = k; x > 0; --x,--k) { undo(v[i].x,v[i].y); } } } return 0; }