50pts求条
查看原帖
50pts求条
1401095
zhangchengqi666楼主2025/1/30 12:04

fhq_Treap 做的,然后就 T 了……

#include <bits/stdc++.h>

using namespace std;

const int N = 1000000 + 5;

struct tree {
	int l, r, pty, val, sz;
} node[N]; 

int n, num, root, dl, dr, m;

void pushup(int x) {
	node[x].sz = node[node[x].l].sz + node[node[x].r].sz + 1;
	return;
}

void split(int u, int & l, int & r, int val) {
	if (!u) {
		l = r = 0;
		return;
	} 
	if (node[u].val <= val) {
		l = u;
		split(node[u].r, node[u].r, r, val);
	} else {
		r = u;
		split(node[u].l, l, node[u].l, val);
	}
	pushup(u);
	return;
}

void add(int val) {
	num++;
	node[num].val = val;
	node[num].sz = 1;
	node[num].pty = rand();
	node[num].l = 0;
	node[num].r = 0;
	return;
}

int merge(int l, int r) {
	if (!l || !r) {
		return l + r;
	}
	if (node[l].pty <= node[r].pty) {
		node[l].r = merge(node[l].r, r);
		pushup(l);
		return l;
	} else {
		node[r].l = merge(l, node[r].l);
		pushup(r);
		return r;
	}
}

int kth(int u, int p) {
	if (p <= node[node[u].l].sz && node[u].l) {
		return kth(node[u].l, p);
	} else if (p == node[node[u].l].sz + 1) {
		return u;
	} else {
		p -= node[node[u].l].sz + 1;
		if (node[u].r && p) {
			return kth(node[u].r, p);
		}
	}
}

int main(void) {
	cin >> n >> m;
	srand(time(NULL));
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		split(root, dl, dr, x);
		add(x);
		root = merge(merge(dl, num), dr);
	}
	int opt, x;
	for (int i = 1; i <= m; i++) {
		cin >> opt >> x;
		if (opt == 2){
			split(root, dl, dr, x);
			add(x);
			root = merge(merge(dl, num), dr);
		} else {
			cout << node[kth(root, n - x + 1)].val << endl;
		}
	} 
	return 0;
}
2025/1/30 12:04
加载中...