样例不过,前两个输出 1,后面三个是对的 /kel /kel
#include<bits/stdc++.h>
using namespace std;
#define pl (p<<1)
#define pr (p<<1|1)
const int N=5e4+10,NLOGN=1e6+10,inf=2147483647;
int n,q,a[N],rt[N<<2];
struct Treap{
int tot,val[NLOGN],dat[NLOGN],cnt[NLOGN],siz[NLOGN],son[NLOGN][2];
int add(int v){return++tot,val[tot]=v,dat[tot]=rand(),cnt[tot]=siz[tot]=1,tot;}
void push_up(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
void rotate(int&x,int d){int tmp=son[x][d^1];son[x][d^1]=son[tmp][d],son[tmp][d]=x,x=tmp,push_up(son[x][d]),push_up(x);}
void insert(int&x,int v){
if(!x)return x=add(v),void();
if(v==val[x])return ++cnt[x],push_up(x);
int d=v<val[x]?0:1;insert(son[x][d],v),dat[x]<dat[son[x][d]]&&(rotate(x,d^1),1),push_up(x);
}void remove(int&x,int v){
if(!x)return;
if(v==val[x]){
if(cnt[x]>1)return--cnt[x],push_up(x);
if(son[x][0]||son[x][1])!son[x][1]||dat[son[x][0]]>dat[son[x][1]]?(rotate(x,1),remove(son[x][1],v),1):(rotate(x,0),remove(son[x][0],v),1),push_up(x);
else x=0;
}else v<val[x]?(remove(son[x][0],v),1):(remove(son[x][1],v),1),push_up(x);
}int getrank(int x,int v){
if(!x)return 0;
if(v==val[x])return siz[son[x][0]];
return v<val[x]?getrank(son[x][0],v):getrank(son[x][1],v)+siz[son[x][0]]+cnt[x];
}int getlast(int rt,int v){
int x=rt,ret=-inf;
while(x)v>val[x]?(ret=val[x],x=son[x][1]):x=son[x][0];
return ret;
}int getnext(int rt,int v){
int x=rt,ret=inf;
while(x)v<val[x]?(ret=val[x],x=son[x][0]):x=son[x][1];
return ret;
}
}t;
void build(int l,int r,int p){
for(int i=l;i<=r;i++)t.insert(rt[p],a[i]);
if(l==r)return;
int mid=l+r>>1;build(l,mid,pl),build(mid+1,r,pr);
}void update(int l,int r,int k,int v,int p){
t.remove(rt[p],a[k]),t.insert(rt[p],v);
if(l==r)return;
int mid=l+r>>1;k<=mid?(update(l,mid,k,v,pl),1):(update(mid+1,r,k,v,pr),1);
}int queryrank(int l,int r,int le,int ri,int v,int p){
if(l>=le&&r<=ri)return t.getrank(rt[p],v);
int mid=l+r>>1,ret=0;
return le<=mid&&(ret+=queryrank(l,mid,le,ri,v,pl)),ri>mid&&(ret+=queryrank(mid+1,r,le,ri,v,pr)),ret;
}int queryval(int l,int r,int rk){
int L=0,R=1e8,mid;
for(;L<R;queryrank(1,n,l,r,mid=L+R>>1,1)+1<=rk?L=mid:R=mid-1);
return L;
}int querylast(int l,int r,int le,int ri,int v,int p){
if(l>=le&&r<=ri)return t.getlast(rt[p],v);
int mid=l+r>>1,ret=-inf;
return le<=mid&&(ret=max(ret,querylast(l,mid,le,ri,v,pl))),ri>mid&&(ret=max(ret,querylast(mid+1,r,le,ri,v,pr))),ret;
}int querynext(int l,int r,int le,int ri,int v,int p){
if(l>=le&&r<=ri)return t.getnext(rt[p],v);
int mid=l+r>>1,ret=inf;
return le<=mid&&(ret=min(ret,querynext(l,mid,le,ri,v,pl))),ri>mid&&(ret=min(ret,querynext(mid+1,r,le,ri,v,pr))),ret;
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
for(int op,l,r,x;q--;){
cin>>op>>l>>r;
if(op==1)cin>>x,cout<<queryrank(1,n,l,r,x,1)+1<<'\n';
if(op==2)cin>>x,cout<<queryval(1,n,x)<<'\n';
if(op==3)update(1,n,l,r,1),a[l]=r;
if(op==4)cin>>x,cout<<querylast(1,n,l,r,x,1)<<'\n';
if(op==5)cin>>x,cout<<querynext(1,n,l,r,x,1)<<'\n';
}return 0;
}