Wrong answer on line 18499, read '-',expected 0
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define rep(a,b,c) for(int a=b;a<=c;a++)
struct ptphs{
tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update> T;
int tot=0;
void insert(int x){
T.insert({x,++tot});
}
void erase(int x){
T.erase(T.find_by_order(T.order_of_key({x,0})));
}
int kth(int x){
return (*T.find_by_order(x-1-1)).first;
}
int rnk(int x){
return T.order_of_key({x,0})+1-1;
}
int pre(int x){
return (*T.find_by_order(T.order_of_key({x,0})-1)).first;
}
int nxt(int x){
return (*T.find_by_order(T.order_of_key({x+1,0}))).first;
}
ptphs(){
insert(-2147483647);
insert(2147483647);
}
};
const int N=2e5+10;
#define ls(x) x<<1
#define rs(x) (x<<1)+1
ptphs rc[N];
int n,m;
void edit(int x,int L,int R,int pos,int _val,int val){
rc[x].erase(_val);rc[x].insert(val);
if(L==R)return;
int mid=(L+R)>>1;
if(pos<=mid){
edit(ls(x),L,mid,pos,_val,val);
}else{
edit(rs(x),mid+1,R,pos,_val,val);
}
}
int grank(int x,int L,int R,int l,int r,int val){
int ans=0;
int mid=(L+R)>>1;
if(l<=L&&R<=r){
return rc[x].rnk(val);
}
if(l<=mid){
ans+=grank(ls(x),L,mid,l,r,val);
}if(r>mid){
if(ans)ans--;ans+=grank(rs(x),mid+1,R,l,r,val);
}
return ans;
}
int gkth(int x,int L,int R,int l,int r,int val){
int mid;
while(L<R){
mid=(L+R+1)>>1;
if(val>=grank(1,1,n,l,r,mid)){
L=mid;
}else R=mid-1;
}return L;
}
int gpre(int x,int L,int R,int l,int r,int val){
int ans=0;
int mid=(L+R)>>1;
if(l<=L&&R<=r){
return rc[x].pre(val);
}
if(l<=mid){
ans=gpre(ls(x),L,mid,l,r,val);
}if(r>mid){
if(ans)ans=max(ans,gpre(rs(x),mid+1,R,l,r,val));
else ans=gpre(rs(x),mid+1,R,l,r,val);
}
return ans;
}
int gaft(int x,int L,int R,int l,int r,int val){
int ans=0;
int mid=(L+R)>>1;
if(l<=L&&R<=r){
return rc[x].nxt(val);
}
if(l<=mid){
ans=gaft(ls(x),L,mid,l,r,val);
}if(r>mid){
if(ans)ans=min(ans,gaft(rs(x),mid+1,R,l,r,val));
else ans=gaft(rs(x),mid+1,R,l,r,val);
}
return ans;
}
int a[N];
void build(int x,int L,int R){
rep(i,L,R){
rc[x].insert(a[i]);
}
if(L==R)return;
int mid=L+R>>1;
build(ls(x),L,mid);
build(rs(x),mid+1,R);
}
int main(){
//int n,m;
cin>>n>>m;
rep(i,1,n){
cin>>a[i];
}build(1,1,n);
rep(i,1,m){
int opt;cin>>opt;
if(opt==1){
int l,r,k;cin>>l>>r>>k;
cout<<grank(1,1,n,l,r,k);
}else if(opt==2){
int l,r,k;cin>>l>>r>>k;
cout<<gkth(1,0,1e8,l,r,k);
}else if(opt==3){
int pos,k;cin>>pos>>k;
edit(1,1,n,pos,a[pos],k);
a[pos]=k;
}else if(opt==4){
int l,r,k;cin>>l>>r>>k;
cout<<gpre(1,1,n,l,r,k);
}else{
int l,r,k;cin>>l>>r>>k;
cout<<gaft(1,1,n,l,r,k);
}if(opt!=3)cout<<endl;
}
}