调了一上午了,谁来救救孩子
#pragma GCC target( "avx" )
#pragma GCC target( "avx2" )
#pragma GCC optimize(3,"Ofast","inline")
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,INF=2147483647;
int n,m,opt,l,r,k,pos,tot,top;
int a[N],boot[N<<5];
struct node{int l,r,root;}t[N<<2];
struct BST{int ch[2],fa,val,cnt,size;}s[N<<5];
inline void pushup(int x)
{
s[x].size=s[s[x].ch[0]].size+s[s[x].ch[1]].size+s[x].cnt;
}
inline void rotate(int x)
{
register int y=s[x].fa,z=s[y].fa,k=(x==s[y].ch[1]);
s[z].ch[y==s[z].ch[1]]=x,s[x].fa=z;
s[y].ch[k]=s[x].ch[!k],s[s[x].ch[!k]].fa=y;
s[x].ch[!k]=y,s[y].fa=x;
pushup(y),pushup(x);
}
inline void splay(int &root,int x,int to)
{
while(s[x].fa!=to)
{
register int y=s[x].fa,z=s[y].fa;
if(z!=to) rotate((y==s[z].ch[0])^(x==s[y].ch[0])?x:y);
rotate(x);
}
if(!to) root=x;
}
inline void find(int x,int c)
{
register int u=t[x].root;
while(s[u].ch[c>s[u].val]&&c!=s[u].val) u=s[u].ch[c>s[u].val];
splay(t[x].root,u,0);
}
inline int next(int x,int c,bool k)
{
find(x,c);
if(s[t[x].root].val<c&&!k) return t[x].root;
if(s[t[x].root].val>c&&k) return t[x].root;
register int u=s[t[x].root].ch[k];
while(s[u].ch[!k]) u=s[u].ch[!k];
return u;
}
inline int newnode(void)
{
if(top) return boot[top--];
return ++tot;
}
inline void insert(int x,int c)
{
if(!t[x].root)
{
s[t[x].root=newnode()]=(BST){{0,0},0,c,1,1};
return;
}
register int u=t[x].root,fa=0;
while(u&&s[u].val!=c) fa=u,u=s[u].ch[c>s[u].val];
if(u) ++s[u].cnt;
else
{
s[fa].ch[c>s[fa].val]=u=newnode();
s[u]=(BST){{0,0},fa,c,1,1};
}
splay(t[x].root,u,0);
}
inline void remove(int x,int c)
{
register int l=next(x,c,0),r=next(x,c,1);
splay(t[x].root,l,0),splay(t[x].root,r,l);
if(s[s[r].ch[0]].cnt>1) --s[s[r].ch[0]].cnt;
else
{
boot[++top]=s[r].ch[0];
s[s[r].ch[0]]=(BST){{0,0},0,0,0,0};
s[r].ch[0]=0;
}
pushup(r),pushup(l);
}
inline void build(int u,int l,int r)
{
t[u].l=l,t[u].r=r;
insert(u,INF),insert(u,-INF);
for(register int i=l;i<=r;++i)
insert(u,a[i]);
if(l==r) return;
register int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
inline int opt1(int u,int l,int r,int k)
{
if(t[u].l>=l&&t[u].r<=r)
{
find(u,k);
if(s[t[u].root].val<k) return s[t[u].root].cnt+s[s[t[u].root].ch[0]].size-1;
return s[s[t[u].root].ch[0]].size-1;
}
register int mid=t[u].l+t[u].r>>1,res=0;
if(l<=mid) res+=opt1(u<<1,l,r,k);
if(r>mid) res+=opt1(u<<1|1,l,r,k);
return res;
}
inline int opt2(int l,int r,int k)
{
register int L=0,R=1e8,ans=0;
while(L<=R)
{
register int mid=L+R>>1;
if(opt1(1,l,r,mid)+1<=k) L=mid+1,ans=mid;
else R=mid-1;
}
return ans;
}
inline void opt3(int u,int pos,int k)
{
remove(u,a[pos]),insert(u,k);
if(t[u].l==t[u].r) return;
register int mid=t[u].l+t[u].r>>1;
if(pos<=mid) opt3(u<<1,pos,k);
else opt3(u<<1|1,pos,k);
}
inline int opt4(int u,int l,int r,int k)
{
if(t[u].l>=l&&t[u].r<=r) return s[next(u,k,0)].val;
register int mid=t[u].l+t[u].r>>1,ans=-INF;
if(l<=mid) ans=max(ans,opt4(u<<1,l,r,k));
if(r>mid) ans=max(ans,opt4(u<<1|1,l,r,k));
return ans;
}
inline int opt5(int u,int l,int r,int k)
{
if(t[u].l>=l&&t[u].r<=r) return s[next(u,k,1)].val;
register int mid=t[u].l+t[u].r>>1,ans=INF;
if(l<=mid) ans=min(ans,opt5(u<<1,l,r,k));
if(r>mid) ans=min(ans,opt5(u<<1|1,l,r,k));
return ans;
}
int main(void)
{
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;++i)
scanf("%d",a+i);
build(1,1,n);
while(m--)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",opt1(1,l,r,k)+1);
}
else if(opt==2)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",opt2(l,r,k));
}
else if(opt==3)
{
scanf("%d%d",&pos,&k);
opt3(1,pos,k);
a[pos]=k;
}
else if(opt==4)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",opt4(1,l,r,k));
}
else
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",opt5(1,l,r,k));
}
}
return 0;
}