不知道哪里错了
查看原帖
不知道哪里错了
911299
possible981楼主2024/7/30 20:00
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f;
using namespace std;
inline int read() {
	int x=0,f=0,ch=getchar();
	while(!isdigit(ch)) f|=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int m=2e7;
const int N=1e5+5;
int n;
int cnt;
int root;
struct node {
	int ls,rs;
	int l,r;
	int siz;
}tr[N*30];
struct segment {
	#define ls(u) tr[u].ls
	#define rs(u) tr[u].rs
	#define mid(u) (tr[u].l+tr[u].r>>1)
	int New() {
		++cnt;
		tr[cnt].ls=tr[cnt].rs=tr[cnt].siz=0;
		tr[cnt].l=tr[cnt].r=0;
		return cnt;
	}
	void up(int u) {
		tr[u].siz=tr[ls(u)].siz+tr[rs(u)].siz;
	}
	void insert(int u,int l,int r,int x) {
		tr[u].l=l;
		tr[u].r=r;
		if(l==r) {
			tr[u].siz++;
			return ;
		}
		if(x<=mid(u)) {
			if(!ls(u)) ls(u)=New();
			insert(ls(u),l,mid(u),x);
		}
		else {
			if(!rs(u)) rs(u)=New();
			insert(rs(u),mid(u)+1,r,x);
		}
		up(u);
	}
	void del(int u,int x) {
		if(tr[u].l==tr[u].r) {
			tr[u].siz--;
			return ;
		}
		if(x<=mid(u)) {
			if(!ls(u)) return ;
			del(ls(u),x);
		}
		else {
			if(!rs(u)) return ;
			del(rs(u),x);
		}
		up(u);
	}
	int rnk(int u,int l,int r) {
		if(!u) return 0;
		if(tr[u].l>r||tr[u].r<l) return 0;
		if(tr[u].l>=l&&tr[u].r<=r) return tr[u].siz;
		return rnk(ls(u),l,r)+rnk(rs(u),l,r);
	}
	int num(int u,int x) {
		if(tr[u].l==tr[u].r) return tr[u].l;
		if(!ls(u)||tr[ls(u)].siz<x) return num(rs(u),x-tr[ls(u)].siz);
		return num(ls(u),x);
	}
	int nxt(int u,int x) {
		if(tr[u].r<=x) return INF;
		if(tr[u].l==tr[u].r) return tr[u].l;
		if(tr[u].l>x) {
			if(tr[ls(u)].siz>0) return nxt(ls(u),x);
			return nxt(rs(u),x);
		}
		return min(nxt(ls(u),x),nxt(rs(u),x));
	}
}t;

int main() {
	n=read();
	root=t.New();
	while(n--) {
		int op,x;
		op=read();
		x=read();
		if(op==1) 
			t.insert(root,-m,m,x);
		else if(op==2) 
			t.del(root,x);
		else if(op==3) 
			printf("%d\n",t.rnk(root,-m,x-1)+1);
		else if(op==4) 
			printf("%d\n",t.num(root,x));
		else if(op==5) 
			printf("%d\n",t.num(root,t.rnk(root,-m,x-1)));
		else if(op==6) 
			printf("%d\n",t.nxt(root,x));
	}	
	return 0;
} 
2024/7/30 20:00
加载中...