30pts FHQ-Treap qt!
查看原帖
30pts FHQ-Treap qt!
748854
FunKingDoor楼主2022/11/11 10:09
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

const int MX = 100205;

struct node {
	int ch[2];
	int siz, val, rnd;
}t[MX];

int q, low;
int root, tot;

void update(int id) {
	t[id].siz = t[t[id].ch[0]].siz + t[t[id].ch[1]].siz + 1;
}

int newNode(int val) {
	t[++tot].siz = 1;
	t[tot].val = val;
	t[tot].rnd = rand();
	return tot;
}
inline void split(int id, int val, int &x, int &y) {
	if(!id) return (void)(x = y = 0);
	else {
		if(val < t[id].val) {
			y = id;
			split(t[id].ch[0], val, x, t[id].ch[0]);
		} else {
			x = id;
			split(t[id].ch[1], val, t[id].ch[1], y);
		}
		update(id);
	}
}
int merge(int x, int y) {
	if(!x || !y) return x + y;
	if(t[x].rnd <= t[y].rnd) {
		int k = (t[y].val > t[x].val ? 1 : 0);
		t[x].ch[k] = merge(t[x].ch[k], y);
		update(x);
		return x;
	}
	int k = (t[x].val > t[y].val ? 1 : 0);
	t[y].ch[k] = merge(x, t[y].ch[k]);
	update(y);
	return y;
}

void insert(int id, int val) {
	int t1, t2;
	split(root, val, t1, t2);
	root = merge(t1, merge(newNode(val), t2));
}
inline int kth(int id, int k){
	if(!id) return 0;
	int lsiz = t[t[id].ch[0]].siz;
	if(k < lsiz) return kth(t[id].ch[0], k);
	if(k > lsiz) return kth(t[id].ch[1], k - lsiz - 1);
	return t[id].val;
}
int mov = 0, ans = 0;
int main(){
	srand((unsigned)time(NULL));
	cin >> q >> low;
	while(q--){
		char op;
		int val;
		cin >> op >> val;
		switch(op){
			case 'I':
				if(val - mov < low) break;
				insert(root, val - mov);
				break;
			case 'A':
				low -= val;
				mov += val;
				break;
			case 'S':
				low += val;
				mov -= val;
				int x, y;
				split(root, low - 1, x, y);
				root = y;
				ans += t[x].siz;
				break;
			default:
				if(t[root].siz < val) {
					cout << -1 << endl;
					break;
				} 
				cout << kth(root, t[root].siz - val) + mov << endl;
				break;
		}
	}
	cout << ans;
	return 0;
}
2022/11/11 10:09
加载中...