全RE,但本地正确,求调
查看原帖
全RE,但本地正确,求调
695686
13245zy楼主2023/12/18 20:34

RE记录 https://www.luogu.com.cn/record/140133384

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
#define N 10000010
using namespace std;
struct node{
	int l,r,sum;
}tr[4*N];
int a[N],b[N],opt[N];
void build(int c,int x,int y){
	tr[c].l=x,tr[c].r=y;
	if(x==y) return;
	int mid=(x+y)/2;
	build(c*2,x,mid);
	build(c*2+1,mid+1,y);
}
int query_rank(int c,int x,int y){
	if(tr[c].l==x&&tr[c].r==y) return tr[c].sum;
	int mid=(tr[c].l+tr[c].r)/2;
	if(y<=mid) return query_rank(c*2,x,y);
	else if(x>mid) return query_rank(c*2+1,x,y);
	else return query_rank(c*2,x,mid)+query_rank(c*2+1,mid+1,y);
}
int query_num(int c,int x){
	if(tr[c].l==tr[c].r) return tr[c].l;
	if(x<=tr[c*2].sum) return query_num(c*2,x);
	else return query_num(c*2+1,x-tr[c*2].sum);
}
void modify(int c,int x,int k){
	if(tr[c].l==tr[c].r){
		tr[c].sum+=k;
		return;
	}
	int mid=(tr[c].l+tr[c].r)/2;
	if(x<=mid) modify(c*2,x,k);
	else modify(c*2+1,x,k);
	tr[c].sum=tr[c*2].sum+tr[c*2+1].sum;
}
signed main(){
	int n;
	cin>>n;
	build(1,1,n);
	int x,k;
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&opt[i],&a[i]);
		if(opt[i]!=4) b[++k]=a[i];
	}
	sort(b+1,b+k+1);
	k=unique(b+1,b+k+1)-b-1;
	int id;
	for(int i=1;i<=n;i++){
		if(opt[i]!=4) id=lower_bound(b+1,b+n+1,a[i])-b;
		if(opt[i]==1) modify(1,id,1);
		else if(opt[i]==2) modify(1,id,-1);
		else if(opt[i]==3){
			if(id==1) printf("1\n");
			else printf("%lld\n",query_rank(1,1,id-1)+1);
		}
		else if(opt[i]==4) printf("%lld\n",b[query_num(1,a[i])]);
		else if(opt[i]==5){
			int m=query_rank(1,1,id-1);
			printf("%lld\n",b[query_num(1,m)]);
		}
		else{
			int m=query_rank(1,1,id+1);
			printf("%lld\n",b[query_num(1,m)]);
		}
	}
	return 0;
}
2023/12/18 20:34
加载中...