求助
查看原帖
求助
304551
xfzf_shentao楼主2023/10/18 19:41
#include<bits/stdc++.h>
using namespace std;
#define N 1000100
#define int long long
int n;
int read() {
	int x=0,f=1;
	char ch=getchar();
	for(; ch<'0'||ch>'9'; ch=getchar()) if (ch=='-') f=-1;
	for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-48;
	return x*f;
}
struct node {
	int l,r;
	int key,val,size;
} tr[N];
int x,y,z;
int root,idx;
void updata(int p) {
	tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
}
int get_node(int key) {
	tr[++idx].key=key;
	tr[idx].val=rand();
	tr[idx].size=1;
	return idx;
}
void split(int p,int key,int &x,int &y) {
	if (!p) x=y=0;
	else {
		if (tr[p].key<=key) {
			x=p;
			split(tr[p].r,key,tr[p].r,y);
		} else {
			y=p;
			split(tr[p].l,key,x,tr[p].l);
		}
		updata(p);
	}
}
int merge(int x,int y) {
	if (!x||!y) return x+y;
	if (tr[x].val>tr[y].val) {
		tr[x].r=merge(tr[x].r,y);
		updata(x);
		return x;
	} else {
		tr[y].l=merge(x,tr[y].l);
		updata(y);
		return y;
	}
}
void insert(int key) {
	split(root,key,x,y);
	root=merge(merge(x,get_node(key)),y);
}
void del(int key) {
	split(root,key,x,z);
	split(x,key-1,x,y);
	y=merge(tr[y].l,tr[y].r);
	root=merge(merge(x,y),z);
}
void get_rank(int key){
	split(root,key-1,x,y);
	printf("%lld\n",tr[x].size+1);
	root=merge(x,y);
}
void get_key(int rank) {
	int p=root;
	while(p) {
		if (tr[tr[p].l].size+1==rank) {
			break;
		} else if (tr[tr[p].l].size>=rank){
			p=tr[p].l;
		}else{
			rank=rank-tr[tr[p].l].size+1;
			p=tr[p].r; 
		}
	}
	printf("%lld\n",tr[p].key);
}
void get_prev(int key){
	split(root,key-1,x,y);
	int p=x;
	while (tr[p].r) p=tr[p].r;
	printf("%lld\n",tr[p].key);
	root=merge(x,y);
}
void get_next(int key){
	split(root,key,x,y);
	int p=y;
	while (tr[p].l) p=tr[p].l;
	printf("%lld\n",tr[p].key);
	root=merge(x,y);
}
signed main() {
	int op,x;
	for(int T=read(); T; T--) {
		op=read();
		x=read();
		if (op==1) insert(x);
		if (op==2) del(x);
		if (op==3) get_rank(x);
		if (op==4) get_key(x);
		if (op==5) get_prev(x);
		if (op==6) get_next(x);
	}
	return 0;
}
2023/10/18 19:41
加载中...