普通版已过,关注,求调,treap 36分
查看原帖
普通版已过,关注,求调,treap 36分
557781
ruojiyz楼主2023/4/26 20:27
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1100005, M=1e11;

int n, m, ans;
int idx, root;
struct node{
	int l, r;
	int key, val;
	int cnt,size;
}tr[N];
int opt, x, last;

void pushup(int p)
{
	tr[p].size = tr[tr[p].l].size + tr[tr[p].r].size + tr[p].cnt;
}

int getnode(int key)
{
	tr[ ++ idx].key = key;
	tr[idx].val = rand();
	tr[idx].cnt = tr[idx].size = 1;
	return idx;
}

void build()
{
	getnode(-M);
	getnode(M);
	tr[1].r = 2;
	root = 1;
	pushup(root);
}

void zig(int &p)
{
	int q = tr[p].l;
	tr[p].l = tr[q].r;
	tr[q].r = p;
	p = q;
	pushup(tr[p].r);
	pushup(p);
}

void zag(int &p)
{
	int q = tr[p].r;
	tr[p].r = tr[q].l;
	tr[q].l = p;
	p = q;
	pushup(tr[p].l);
	pushup(p);
}

void insert(int &p, int key)
{
	if(!p) p = getnode(key);
	else if(tr[p].key == key) tr[p].cnt ++;
	else if(tr[p].key > key)
	{
		insert(tr[p].l, key);
		if(tr[tr[p].l].val > tr[p].val) zig(p);
	}
	else 
	{
		insert(tr[p].r, key);
		if(tr[tr[p].r].val > tr[p].val) zag(p);
	}
	pushup(p);
}

void remove(int &p, int key)
{
	if(!p) return;
	if(tr[p].key == key)
	{
		if(tr[p].cnt > 1) tr[p].cnt --;
		else if(!tr[p].l && !tr[p].r) p = 0;
		else
		{
			if(!tr[p].r || tr[tr[p].l].val > tr[tr[p].r].val) 
				zig(p), remove(tr[p].r, key);
			else 
				zag(p), remove(tr[p].l, key);
		}
	}
	else if(tr[p].key > key) remove(tr[p].l ,key);
	else remove(tr[p].r, key);
	pushup(p);
}

int getrank(int p, int key)
{
	if(!p) return 0;
	if(tr[p].key == key) return tr[tr[p].l].size + 1;
	if(tr[p].key > key) return getrank(tr[p].l, key);
	return tr[tr[p].l].size + tr[p].cnt + getrank(tr[p].r, key);
}

int getkey(int p, int rank)
{
	if(!p) return M;
	if(tr[tr[p].l].size >= rank) return getkey(tr[p].l, rank);
	if(tr[tr[p].l].size + tr[p].cnt >= rank) return tr[p].key;
	return getrank(tr[p].r, rank - tr[tr[p].l].size - tr[p].cnt);
}

int getprev(int p, int key)
{
	if(!p) return -M;
	if(tr[p].key >= key) return getprev(tr[p].l, key);
	return max(tr[p].key, getprev(tr[p].r, key));
}

int getnext(int p, int key)
{
	if(!p) return M;
	if(tr[p].key <= key) return getnext(tr[p].r, key);
	return min(tr[p].key, getnext(tr[p].l, key));
}

signed main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	build(); 
	
	cin >> n >> m;
	for(int i = 1; i <= n; i ++ )
	{
		cin >> x;
		insert(root, x);
	} 
	for(int i = 1; i <= m; i ++ )
	{
		cin >> opt >> x; x ^= last;
		if(opt == 1) insert(root, x);
		else if(opt == 2) remove(root, x);
		else 
		{
			if(opt == 3) last = getrank(root, x) - 1;
			else if(opt == 4) last = getkey(root, x + 1);
			else if(opt == 5) last = getprev(root, x);
			else last = getnext(root, x);
			ans ^= last;
		}
	}
	cout << ans;
	return 0;
}

2023/4/26 20:27
加载中...