#include #include #include using namespace std; const int NMAX=100005; const int buffer=1<<13; char buff[buffer]; int cnt=0; struct op { int x,y; } A[NMAX]; struct query { int x,y; } B[NMAX]; vector v[NMAX]; int t,n,m,x,y,nr,num,GR[NMAX]; int k,st[NMAX],sol[NMAX]; int grupa(int k) { if (GR[k]==k) return k; GR[k]=grupa(GR[k]); return GR[k]; } void unifica(int k1, int k2) { int r1=grupa(k1), r2=grupa(k2); GR[r2]=r1; } 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 main() { int i,j; // freopen("date.in","r",stdin); // freopen("date.out","w",stdout); n = getInt(), m = getInt(); for (i=1;i<=m;++i) { t = getInt(), x = getInt(); if (t==1) { y = getInt(); A[++nr].x = x, A[nr].y = y; st[++k]=nr; } else { if (t==2) { for (j=0;j0;++j) --k; } else { y = getInt(); B[++num].x = x, B[num].y = y; v[st[k]].push_back(num); } } } for (i=1;i<=n;++i) GR[i]=i; for (j=0;j