40分,求大佬
查看原帖
40分,求大佬
1066396
szm111213楼主2024/7/19 11:09
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,val;
	int cnt;
	int siz;
}tree[10010];
int cnt;
void insert(int rt,int val)
{
	tree[rt].siz ++;
	if(tree[rt].val == val)
	{
		tree[rt].cnt++;
		return;
	}
	else if(tree[rt].val > val)
	{
		if(tree[rt].l == 0)
		{
			cnt++;
			tree[cnt].val = val;
			tree[cnt].siz = tree[cnt].cnt = 1;
			tree[rt].l = cnt;
		}
		else
		{
			insert(tree[rt].l,val);
		}
	}
	else
	{
		if(tree[rt].r == 0)
		{
			cnt++;
			tree[cnt].val = val;
			tree[cnt].siz = tree[cnt].cnt = 1;
			tree[rt].r = cnt;
		}
		else
		{
			insert(tree[rt].r,val);
		}
	}
	return;
}
int get_rank(int rt,int val)
{
	if(rt==0)
	{
		return 1;
	}
	if(tree[rt].val == val)
	{
		int lchild = tree[rt].l;
		return tree[lchild].siz + 1;
	}
	else if(tree[rt].val > val)
	{
		return get_rank(tree[rt].l,val);
	}
	else
	{
		return tree[tree[rt].l].siz + tree[rt].cnt + get_rank(tree[rt].r,val);
	}
}
int get_val(int rt,int rk)
{
	if(tree[tree[rt].l].siz >= rk)
	{
		return get_val(tree[rt].l,rk);
	}
	else if(tree[tree[rt].l].siz + tree[rt].cnt >= rk)
	{
		return tree[rt].val;
	}
	else
	{
		return get_val(tree[rt].r,rk-tree[tree[rt].l].siz-tree[rt].cnt);
	}
}
int get_pre(int rt,int val)
{
	int rk = get_rank(rt,val);
	if(rk == 1)
	{
		return -2148483647;
	}
	return get_val(1,rk-1);
}
int get_next(int rt,int val)
{
	int rk = get_rank(rt,val + 1);
	if(rk == cnt+1)
	{
		return 2148483647;
	}
	return get_val(rt,rk);
}
int main()
{
	int q;
	cin >> q;
	while(q--)
	{
		int opt, x;
		cin >> opt >> x;
		if(opt==1)
		{
			cout << get_rank(1,x) << endl;
		}
		else if(opt==2)
		{
			cout << get_val(1,x) << endl;
		}
		else if(opt==3)
		{
			cout << get_pre(1,x) << endl;
		}
		else if(opt==4)
		{
			cout << get_next(1,x) << endl;
		}
		else
		{
			if(cnt==0)
			{
				cnt++;
				tree[cnt].val = x;
				tree[cnt].cnt = tree[cnt].siz = 1;
			}
			else
			{
				insert(1,x);
			}
		}
	}
	return 0;
}
2024/7/19 11:09
加载中...