| #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> using namespace std; typedef long long ll; #define FILE "read" #define MAXN 50010 #define INF 1000000000 #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) struct node{ll x,y,opt,k,id;}q[MAXN],stack[MAXN][2]; ll n,m,cnt,ans[MAXN]; namespace INIT{ 	char buf[1<<15],*fs,*ft; 	inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} 	inline ll read(){ 		ll x=0,f=1;  char ch=getc(); 		while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();} 		while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();} 		return x*f; 	} }using namespace INIT; namespace Segment_Tree{ 	ll tr[MAXN<<2],clean[MAXN<<2],delt[MAXN<<2]; 	void relord(int p){tr[p]=tr[p<<1]+tr[p<<1|1];} 	void pushdown(int p,int l,int r){ 		if(clean[p]){ 			clean[p<<1]=clean[p<<1|1]=1;  clean[p]=0; 			delt[p<<1]=delt[p<<1|1]=tr[p<<1]=tr[p<<1|1]=0; 		} 		ll d=delt[p],mid=(l+r)>>1; 		delt[p<<1]+=d;  delt[p<<1|1]+=d; 		tr[p<<1]+=d*(mid-l+1);  tr[p<<1|1]+=d*(r-mid); 		delt[p]=0; 	} 	void insert(int p,int l,int r,int x,int y){ 		if(x>r||y<l)  return; 		if(x<=l&&y>=r)  {delt[p]++; tr[p]+=(r-l+1); return;} 		int mid=(l+r)>>1;  pushdown(p,l,r); 		insert(p<<1,l,mid,x,y); insert(p<<1|1,mid+1,r,x,y); 		relord(p); 	} 	ll ask(int p,int l,int r,int x,int y){ 		if(x>r||y<l)  return 0; 		if(x<=l&&y>=r)  return tr[p]; 		int mid=(l+r)>>1;  pushdown(p,l,r); 		return ask(p<<1,l,mid,x,y)+ask(p<<1|1,mid+1,r,x,y); 	} }using namespace Segment_Tree; void init(){ 	n=read();  m=read(); 	up(i,1,m){ 		ll opt=read(),x=read(),y=read(),k=read(); 		if(opt==1)  q[i]=(node){x,y,opt,k,0}; 		else q[i]=(node){x,y,opt,k,++cnt}; 	} } void solve(int l,int r,int L,int R){ 	if(l>r) return; 	if(L==R){ 		up(i,l,r) if(q[i].opt==2) ans[q[i].id]=L; 		return; 	} 	int mid=(L+R)>>1,ta(0),tb(0); 	clean[1]=1;  delt[1]=tr[1]=0;  	up(i,l,r){ 		if(q[i].opt==1){ 			if(q[i].k<=mid) stack[++ta][0]=q[i]; 			else insert(1,1,n,q[i].x,q[i].y),stack[++tb][1]=q[i]; 		}else{ 			ll temp=ask(1,1,n,q[i].x,q[i].y); 			if(temp<q[i].k) q[i].k-=temp,stack[++ta][0]=q[i]; 			else stack[++tb][1]=q[i]; 		} 	} 	up(i,1,ta) q[i+l-1]=stack[i][0]; 	up(i,1,tb) q[i+l+ta-1]=stack[i][1]; 	solve(l,l+ta-1,L,mid); 	solve(l+ta,r,mid+1,R); } int main(){ 	freopen(FILE".in","r",stdin); 	freopen(FILE".out","w",stdout); 	init(); solve(1,m,-INF,INF); 	up(i,1,cnt) printf("%lld\n",ans[i]); 	return 0; }
 |