#include #define MOD 1000000007 #define Nmax 100005 #define pb push_back #define mp make_pair #define INF 2000000000 #define eps 0.000000000001 using namespace std; multiset St[Nmax],Dr[Nmax]; int a[Nmax],b[Nmax],aint1[3*Nmax],aint2[3*Nmax]; inline void Upd1(int nod, int st, int dr, int p, int val, int t) { if(st==dr) { if(!t) St[st].insert(-val); else St[st].erase(St[st].find(-val)); if(!St[st].size()) aint1[nod]=-INF; else aint1[nod]=-*St[st].begin(); return; } int mij=((st+dr)>>1); if(p<=mij) Upd1(2*nod,st,mij,p,val,t); else Upd1(2*nod+1,mij+1,dr,p,val,t); aint1[nod]=max(aint1[2*nod],aint1[2*nod+1]); } inline void Upd2(int nod, int st, int dr, int p, int val, int t) { if(st==dr) { if(!t) Dr[st].insert(val); else Dr[st].erase(Dr[st].find(val)); if(!Dr[st].size()) aint2[nod]=INF; else aint2[nod]=*Dr[st].begin(); return; } int mij=((st+dr)>>1); if(p<=mij) Upd2(2*nod,st,mij,p,val,t); else Upd2(2*nod+1,mij+1,dr,p,val,t); aint2[nod]=min(aint2[2*nod],aint2[2*nod+1]); } inline int Qry1(int nod, int st, int dr, int x, int y) { if(st==x && y==dr) return aint1[nod]; int mij=((st+dr)>>1); if(y<=mij) return Qry1(2*nod,st,mij,x,y); else if(x>mij) return Qry1(2*nod+1,mij+1,dr,x,y); else return max(Qry1(2*nod,st,mij,x,mij),Qry1(2*nod+1,mij+1,dr,mij+1,y)); } inline int Qry2(int nod, int st, int dr, int x, int y) { if(st==x && y==dr) return aint2[nod]; int mij=((st+dr)>>1); if(y<=mij) return Qry2(2*nod,st,mij,x,y); else if(x>mij) return Qry2(2*nod+1,mij+1,dr,x,y); else return min(Qry2(2*nod,st,mij,x,mij),Qry2(2*nod+1,mij+1,dr,mij+1,y)); } int main() { int i,j,x,y,l=0,tip,n,m; #ifndef ONLINE_JUDGE freopen ("date.in","r",stdin); freopen ("date.out","w",stdout); #endif cin.sync_with_stdio(0); cin>>n>>m; for(i=1;i<3*Nmax;++i) { aint1[i]=-INF; aint2[i]=INF; } while(m--) { cin>>tip; if(tip==1) { cin>>x>>y; a[++l]=x; b[l]=y; Upd1(1,1,n,x,y,0); Upd2(1,1,n,y,x,0); } if(tip==2) { cin>>x; Upd1(1,1,n,a[x],b[x],1); Upd2(1,1,n,b[x],a[x],1); } if(tip==3) { cin>>x>>y; int v1,v2; v1=Qry1(1,1,n,x,y); v2=Qry2(1,1,n,x,y); //cout<y || v2