#include using namespace std; #define PB push_back #define ZERO (1e-10) #define INF int(1e9+1) #define CL(A,I) (memset(A,I,sizeof(A))) #define DEB printf("DEB!\n"); #define D(X) cout<<" "<<#X": "<B&&A-ZERO pll; typedef vector vi; typedef pair ii; typedef vector vii; #define IN(n) int n;scanf("%d",&n); #define FOR(i, m, n) for (int i(m); i < n; i++) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define FT(m, n) FOR(k, m, n) #define aa first #define bb second void ga(int N,int *A){F(N)scanf("%d",A+i);} #define MX (100005) #define LG (19) #define QR (1<st(i,i);} map l; int I,A[MX],X[MX],Y[MX],D[MX]; void CLR(){l.clear(),I=0;} void ADD(int a,int b){A[I]=1,X[I]=a,Y[I]=b,D[I]=INF,l[minmax(a,b)]=I++;} void DEL(int a,int b){A[I]=-1,D[l[minmax(a,b)]]=I++;} void QY(int a,int b){A[I]=0,X[I]=a,Y[I++]=b;} void GO(vi&o){if(I)rc(0,I-1,1,o);} vector> G[LG]; void st(int x,int d){C[d].st(x,C[d-1].GC(x));} void rc(int b,int e,int d,vi&o){ C[d].CLR(),G[d].clear(); FT(b,e+1)st(X[k],d),st(Y[k],d); for(auto&h:G[d-1])st(h.aa.aa,d),st(h.aa.bb,d); for(auto&h:G[d-1])if(h.bb>e)C[d].CON(h.aa.aa,h.aa.bb); else if(h.bb>=b)G[d].PB(h); C[d].pre(); if(b==e){ if(!A[b])o.PB(C[d].GC(X[b])==C[d].GC(Y[b])); return; } int m=(b+e)/2; rc(b,m,d+1,o); FT(b,m+1)if(A[k]>0)G[d].PB({{X[k],Y[k]},D[k]}); rc(m+1,e,d+1,o); } }T; int N,Q,A[MX],X[MX],Y[MX],V[MX],O[MX]; set F; vi o; int main(void){ scanf("%d%d",&N,&Q),CL(O,-1); F(Q){ scanf("%d%d%d",A+i,X+i,Y+i); if(!A[i])scanf("%d",V+i); } FF(10){ T.CLR(),F.clear(); F(Q)if(!A[i]){ if(V[i]<=j)T.ADD(X[i],Y[i]),F.insert(minmax(X[i],Y[i])); }else if(A[i]^1)T.QY(X[i],Y[i]); else if(F.count(minmax(X[i],Y[i])))T.DEL(X[i],Y[i]),F.erase(minmax(X[i],Y[i])); o.clear(),T.GO(o); F((int)o.size())if(!~O[i]&&o[i])O[i]=j; } F((int)o.size())printf("%d\n",O[i]); return 0; }