求助 #7WA 90
查看原帖
求助 #7WA 90
161748
ssilrrr楼主2022/11/7 20:27

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;
    }
}
2022/11/7 20:27
加载中...