fhq-treap 20分
查看原帖
fhq-treap 20分
701221
Chr0n1CleC楼主2022/9/24 15:29
#include<stdio.h>
#define N 100009
#include<stdlib.h>
#include<time.h>

int val[N], prio[N], siz[N], ls[N], rs[N], tot, rt;

inline void updata(int x)
{
	siz[x] = siz[ls[x]] + siz[rs[x]] + 1;
}

inline int New(int x)
{
	val[++ tot] = x, siz[tot] = 1, prio[tot] = rand();
	return tot;
}

void split(int cur, int key, int& x, int& y)
{
	if (!cur)
	{
		x = y = 0;
		return;
	}
	if (val[cur] <= key)
		x = cur, split(rs[cur], key, rs[cur], y);
	else
		y = cur, split(ls[cur], key, x, ls[cur]);
	updata(cur);
}

int merge(int x, int y)
{
	if (!x || !y)
		return x ^ y;
	if (prio[x] > prio[y])
	{
		ls[y] = merge(x, ls[y]);
		updata(y);
		return y;
	}
	else
	{
		rs[x] = merge(rs[x], y);
		updata(x);
		return x;
		
	}
}

inline void insert(int key)
{
	int x = 0, y = 0;
	split(rt, key - 1, x, y);
	rt = merge(merge(x, New(key)), y);
}

inline void del(int key)
{
	int x = 0, y = 0, z = 0;
	split(rt, key, x, z);
	split(x, key - 1, x, y);
	if (y)
		y = merge(ls[y], rs[y]);
	rt = merge(merge(x, y), z);
}

inline int rank(int key)
{
	int x = 0, y = 0, ret;
	split(rt, key - 1, x, y);
	ret = siz[x] + 1;
	rt = merge(x, y);
	return ret;
}

inline int xrank(int key)
{
	int cur = rt;
	while (1)
	{
		int lsiz = siz[ls[cur]] + 1;
		if (key <= lsiz && ls[cur])
			cur = ls[cur];
		else
		{
			key -= lsiz;
			if (key <= 0)
				return val[cur];
			cur = rs[cur];
		}
	}
}

inline int pre(int key)
{
	int x = 0, y = 0, cur, ret;
	split(rt, key - 1, x, y);
	cur = x;
	while (rs[cur])
		cur = rs[cur];
	ret = val[cur];
	rt = merge(x, y);
	return ret;
}

inline int nxt(int key)
{
	int x = 0, y = 0, cur, ret;
	split(rt, key, x, y);
	rt = y;
	while (ls[cur])
		cur = ls[cur];
	ret = val[cur];
	rt = merge(x, y);
	return ret;
}

int main()
{
	srand(time(0));
	int n, opt, x;
	scanf("%d", &n);
	while (n --)
	{
		scanf("%d%d", &opt, &x);
		if (opt == 1)
			insert(x);
		if (opt == 2)
			del(x);
		if (opt == 3)
			printf("%d\n", rank(x));
		if (opt == 4)
			printf("%d\n", xrank(x));
		if (opt == 5)
			printf("%d\n", pre(x));
		if (opt == 6)
			printf("%d\n", nxt(x));
	}
	
	return 0;
}
2022/9/24 15:29
加载中...