#include #include #include #include #include #include #include #include #include #define INF (1<<30) #define mod 666013 using namespace std; const int buffer=1<<13; char buff[buffer]; int cnt=0; //getInt() reads and returns one integer at a time 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; } int n, m, x, y, op, f, i, g, a[100005]; pair pr; vector > o; vector >::iterator itr; vector v[100005]; vector ::iterator it; void DFS(int nod) { a[nod]=f; vector :: iterator it; for(it=v[nod].begin();it!=v[nod].end();it++) { int z=*it; if(z==y) { g=1; return; } if(a[z]!=f) DFS(z); if(g==1) return; } } void D(int x, int y) { vector ::iterator it; for(it=v[x].begin();it!=v[x].end();it++) { if(*it==y) { v[x].erase(it); break; } } for(it=v[y].begin();it!=v[y].end();it++) { if(*it==x) { v[y].erase(it); break; } } } int main() { //freopen("1.in", "r", stdin); //freopen("1.out", "w", stdout); n=getInt(); m=getInt(); f=68; while(m--) { op=getInt(); if(op==1) { x=getInt(); y=getInt(); v[x].push_back(y); v[y].push_back(x); o.push_back(make_pair(x, y)); } else if(op==2) { x=getInt(); for(i=o.size()-1;i>=0;i--) { if(!x) break; x--; pr=o[i]; D(pr.first, pr.second); o.erase(o.begin()+i); } } else { x=getInt(); y=getInt(); f++; g=0; DFS(x); printf("%d\n", g); } } return 0; }