【题目描述】
【解析】
【代码】
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
const int inf=1e9;
const int N=2e5+10;
int n,m,cnt,tot,ans[N],c[N],a[N];
struct node{
int l,r,k,id,op;
}q[N<<2],q1[N<<2],q2[N<<2];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int v){
while(x<=n){
c[x]+=v;
x+=lowbit(x);
}
}
inline int query(int x){
int sum=0;
while(x){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
inline void solve(int L,int R,int l,int r){
if(l>r) return ;
if(L==R){
for(int i=l;i<=r;++i)
if(q[i].op==2) ans[q[i].id]=L;
return ;
}
int mid=(L+R)>>1,cnt1=0,cnt2=0;
for(int i=l;i<=r;++i){
if(q[i].op==1){
if(q[i].l<=mid) q1[++cnt1]=q[i],add(q[i].id,q[i].r);
else q2[++cnt2]=q[i];
}
else{
int t=query(q[i].r)-query(q[i].l-1);
if(q[i].k<=t) q1[++cnt1]=q[i];
else q[i].k-=t,q2[++cnt2]=q[i];
}
}
for(int i=1;i<=cnt1;++i)
if(q1[i].op==1) add(q1[i].id,-q1[i].r);
for(int i=1;i<=cnt1;++i) q[i+l-1]=q1[i];
for(int i=1;i<=cnt2;++i) q[i+l-1+cnt1]=q2[i];
solve(L,mid,l,l+cnt1-1);
solve(mid+1,R,l+cnt1,r);
}
int main(){
n=read();m=read();
for(int i=1;i<=n;++i){
a[i]=read();
q[i]=(node){a[i],1,0,i,1};
}
cnt=n;
for(int i=1;i<=m;++i){
int op=read();
if(op==2)
q[++cnt]=(node){read(),read(),read(),++tot,2};
else{
int x=read(),y=read();
q[++cnt]=(node){a[x],-1,0,x,1};
a[x]=y;
q[++cnt]=(node){a[x],1,0,x,1};
}
}
solve(-inf,inf,1,cnt);
for(int i=1;i<=tot;++i) printf("%d\n",ans[i]);
return 0;
}
{