rt,在本机上使用样例一切正常。
但提交至lg,发现全部输出均被小E吃掉。
下载第1个测试点,有 n=m=49999。
freopen 发现,输出在本机上同样被小E吃掉。
对样例进行 freopen,仍旧一切正常。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(p) p<<1
#define rs(p) p<<1|1
const int N=2e5+9;
int a[N<<5],n,m;
int cnt;
struct Node{
int ls,rs,num,key,sz;
}fhq[N];
int addnode(int val){
cnt++;
fhq[cnt].num=val;
fhq[cnt].ls=fhq[cnt].rs=0;
fhq[cnt].key=rand();
fhq[cnt].sz=1;
return cnt;
}
void update(int p){
fhq[p].sz=fhq[fhq[p].ls].sz+fhq[fhq[p].rs].sz+1;
}
void split(int p,int val,int &rootx,int &rooty){
if(!p){
rootx=rooty=0;
return;
}
if(fhq[p].num<=val){
rootx=p;
split(fhq[p].rs,val,fhq[p].rs,rooty);
}
else{
rooty=p;
split(fhq[p].ls,val,rootx,fhq[p].ls);
}
update(p);
}
int merge(int rootx,int rooty){
if(!rootx||!rooty) return rootx+rooty;
if(fhq[rootx].key>=fhq[rooty].key){
fhq[rootx].rs=merge(fhq[rootx].rs,rooty);
update(rootx);
return rootx;
}
fhq[rooty].ls=merge(rootx,fhq[rooty].ls);
update(rooty);
return rooty;
}
void ins(int &root,int val){
int X,Y;
split(root,val,X,Y);
root=merge(merge(X,addnode(val)),Y);
}
void del(int &root,int val){
int X,Y,Z;
split(root,val,X,Z);
split(X,val-1,X,Y);
Y=merge(fhq[Y].ls,fhq[Y].rs);
root=merge(merge(X,Y),Z);
}
int rk(int &root,int val){
int l=0,r=0;
split(root,val-1,l,r);
int ans=fhq[l].sz;
root=merge(l,r);
return ans;
}
int pre(int &root,int val){
int X,Y;
split(root,val-1,X,Y);
int now=X;
if(!now) return -1e9;
while(fhq[now].rs) now=fhq[now].rs;
int res=fhq[now].num;
root=merge(X,Y);
return res;
}
int nxt(int &root,int val){
int X,Y;
split(root,val,X,Y);
int now=Y;
if(!now) return 1e9;
while(fhq[now].ls) now=fhq[now].ls;
int res=fhq[now].num;
root=merge(X,Y);
return res;
}
int tree[N<<8];
void build(int p,int l,int r){
if(l==r){
tree[p]=addnode(a[l]);
return;
}
for(int i=l;i<=r;i++) ins(tree[p],a[i]);
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
}
int Rank(int p,int l,int r,int x,int y,int d){
if(x<=l&&r<=y) return rk(tree[p],d);
int mid=(l+r)>>1,res=0;
if(x<=mid) res+=Rank(ls(p),l,mid,x,y,d);
if(y>mid) res+=Rank(rs(p),mid+1,r,x,y,d);
return res;
}
int Rknum(int x,int y,int k){
int l=0,r=1e8+1,ans=0;
while(l<r){
int mid=(l+r)>>1;
if(Rank(1,1,n,x,y,mid)<k) ans=mid,l=mid+1;
else r=mid;
}
return ans;
}
void Update(int p,int l,int r,int pos,int k){
del(tree[p],a[pos]);
ins(tree[p],k);
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) Update(ls(p),l,mid,pos,k);
else Update(rs(p),mid+1,r,pos,k);
}
int Pre(int p,int l,int r,int x,int y,int k){
if(x<=l&&r<=y) return pre(tree[p],k);
int mid=(l+r)>>1,res=-1e9;
if(x<=mid) res=max(res,Pre(ls(p),l,mid,x,y,k));
if(y>mid) res=max(res,Pre(rs(p),mid+1,r,x,y,k));
return res==-1e9?-2147483647:res;
}
int Nxt(int p,int l,int r,int x,int y,int k){
if(x<=l&&r<=y) return nxt(tree[p],k);
int mid=(l+r)>>1,res=1e9;
if(x<=mid) res=min(res,Nxt(ls(p),l,mid,x,y,k));
if(y>mid) res=min(res,Nxt(rs(p),mid+1,r,x,y,k));
return res==1e9?2147483647:res;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
int op,l,r,k;
for(int i=1;i<=m;i++){
cin>>op;
if(op==1){
cin>>l>>r>>k;
cout<<Rank(1,1,n,l,r,k)+1<<"\n";
}
else if(op==2){
cin>>l>>r>>k;
cout<<Rknum(l,r,k)<<"\n";
}
else if(op==3){
cin>>l>>k;
Update(1,1,n,l,k);
a[l]=k;
}
else if(op==4){
cin>>l>>r>>k;
cout<<Pre(1,1,n,l,r,k)<<"\n";
}
else{
cin>>l>>r>>k;
cout<<Nxt(1,1,n,l,r,k)<<"\n";
}
}
return 0;
}