1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include<bits/stdc++.h> #define gc getchar #define pc putchar #define F(i,x,y) for(int i=x;i<=y;++i) #define R(i,x,y) for(int i=x;i>=y;--i) #define int long long inline int read(){ int x=0;bool p=1;char ch=gc(); while (!isdigit(ch)) ch=='-'?p=0:0,ch=gc(); while ( isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc(); return p?x:-x; } void print(int x){ if (x<0) pc('-'),x=-x;if (x>9) print(x/10);pc('0'+x%10); } const int N=5e4+5; struct node{ int val,tag; } G[N];int idx,maxn,v[N],logmaxn; inline bool cmpval(node a,node b){ return a.val>b.val; } bool qtag[N];int ql[N],qr[N],qc[N]; int n,m,tot; int T[N*301],son[N*301][2],lz[N*301]; inline int qson(int x,int y){ return (son[x][y])?(son[x][y]):(son[x][y]=++tot); } inline void Add(int k,int l,int r,int v){ T[k]+=(r-l+1)*v,lz[k]+=v; } inline void pushdown(int k,int l,int r,int mid){ if (l==r||!lz[k]) return; Add(qson(k,0),l,mid,lz[k]),Add(qson(k,1),mid+1,r,lz[k]); lz[k]=0; } inline void pushup(int k){ T[k]=T[qson(k,0)]+T[qson(k,1)]; } inline int Query(int k,int l,int r,int le,int ri){ if (l>=le&&r<=ri) return T[k]; int mid=l+r>>1,res=0;pushdown(k,l,r,mid); if (mid>=le) res+=Query(qson(k,0),l,mid,le,ri); if (mid< ri) res+=Query(qson(k,1),mid+1,r,le,ri); return res; } inline void Modify(int k,int l,int r,int le,int ri){ if (l>=le&&r<=ri) return Add(k,l,r,1); int mid=l+r>>1,res=0;pushdown(k,l,r,mid); if (mid>=le) Modify(qson(k,0),l,mid,le,ri); if (mid< ri) Modify(qson(k,1),mid+1,r,le,ri); pushup(k); } inline void I(int le,int ri,int c){ for (;c<=maxn;c+=c&-c) Modify(c,1,n,le,ri); } inline int Findk(int le,int ri,int k){ int res=0; R(i,logmaxn,0){ if (res+(1<<i)>maxn) continue; int d=Query(res+(1<<i),1,n,le,ri); if (d<k) k-=d,res+=(1<<i); } return res+1; } signed main(){ n=read(),m=read(); F(i,1,m){ qtag[i]=read()&1,ql[i]=read(),qr[i]=read(),qc[i]=read(); if (qtag[i]) G[++idx].tag=i,G[idx].val=qc[i]; } std::sort(G+1,G+1+idx,cmpval); int pre=N; F(i,1,idx){ if (G[i].val!=pre) pre=G[i].val,v[++maxn]=pre; qc[G[i].tag]=maxn; } logmaxn=log2(maxn),tot=maxn; F(i,1,m){ if (qtag[i]) I(ql[i],qr[i],qc[i]); else print(v[Findk(ql[i],qr[i],qc[i])]),pc('\n'); } return 0; }
|