FHQ-Treap 0分求调
查看原帖
FHQ-Treap 0分求调
482610
Mortidesperatslav楼主2024/3/31 21:37
#include<bits/stdc++.h>
#define mxn 100005
using namespace std;
struct node{
	int ls, rs, vl, nc, siz, ct;//nc = nonce, 随机值 
}tr[mxn];
int cnt, rt, q;
int nw(int x){
	tr[++cnt].vl = x;
	tr[++cnt].nc = rand();
	tr[++cnt].siz = 1;
	tr[++cnt].ct = 1;
	return cnt;
}
void pup(int u){
	tr[u].siz = tr[tr[u].ls].siz + tr[tr[u].rs].siz + tr[u].ct;
}
void build(){
	rt = nw(-1145141919);
	tr[rt].ls = nw(1145141919);
	pup(rt);
}
void rtt(int &id, int fx){
	if (fx == 0){
		int tmp = tr[id].rs;
		tr[id].rs = tr[tmp].ls;
		tr[tmp].ls = id;
		id = tmp;
		pup(tr[id].ls);
		pup(id);
	}else{
		int tmp = tr[id].ls;
		tr[id].ls = tr[tmp].rs;
		tr[tmp].rs = id;
		id = tmp;
		pup(tr[id].rs);
		pup(id);
	}
}
void ins(int &id, int x){
	if (id == 0){
		id = nw(x);
		return;
	}else{
		if (x == tr[id].vl)
			tr[id].ct++;
		else{
			if (x < tr[id].vl){
				ins(tr[id].ls, x);
				if (tr[id].nc < tr[tr[id].ls].nc)
					rtt(id, 1);
			}else{
				ins(tr[id].rs, x);
				if (tr[id].nc < tr[tr[id].rs].nc)
					rtt(id, 0);
			}
			pup(id);
		}
	}
}
void del(int &id, int x){
	if (!id)
		return;
	if (x == tr[id].vl){
		if (tr[id].ct > 1){
			tr[id].ct--;
			pup(id);
			return;
		}
		if (tr[id].ls || tr[id].rs){
			if (!tr[id].rs || tr[tr[id].ls].nc > tr[tr[id].rs].nc){
				rtt(id, 1);
				del(tr[id].rs, x);
			}else{
				rtt(id, 0);
				del(tr[id].ls, x);
			}
			pup(id);
		}else{
			id = 0;
			return;
		}
	}
	if (x < tr[id].vl)
		del(tr[id].ls, x);
	else
		del(tr[id].rs, x);
	pup(id);
}
int qrk(int id, int x){
	if (!id)
		return 1;
	if (x == tr[id].vl)
		return tr[tr[id].ls].siz + 1;
	else if (x < tr[id].vl)
		return qrk(tr[x].ls, x);
	else
		return tr[tr[id].ls].siz + tr[id].ct + qrk(tr[x].rs, x);
}
int qvl(int id, int rk){
	if (!id)
		return 1145141919;
	if (rk <= tr[tr[id].ls].siz)
		return qvl(tr[id].ls, rk);
	else if (rk <= tr[tr[id].ls].siz + tr[id].ct)
		return tr[id].vl;
	else
		return qvl(tr[id].rs, rk - tr[tr[id].rs].siz - tr[id].ct);
}
int qpr(int x){
	int id = rt, pr;
	while (id){
		if (tr[id].vl < x)
			pr = tr[id].vl, id = tr[id].rs;
		else
			id = tr[id].ls;
	}
	return pr;
}
int qnx(int x){
	int id = rt, nx;
	while (id){
		if (tr[id].vl > x)
			nx = tr[id].vl, id = tr[id].ls;
		else
			id = tr[id].rs;
	}
	return nx;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	build();
	cin >> q;
	while (q--){
		int op, x;
		cin >> op >> x;
		if (op == 1)
			ins(rt, x);
		else if (op == 2)
			del(rt, x);
		else if (op == 3)
			cout << qrk(rt, x) - 1 << "\n";
		else if (op == 4)
			cout << qvl(rt, x + 1) << "\n";
		else if (op == 5)
			cout << qpr(x) << "\n";
		else if (op == 6)
			cout << qnx(x) << "\n";
	}
}
2024/3/31 21:37
加载中...