萌新过不去样例求助
查看原帖
萌新过不去样例求助
716260
SegmentTree_楼主2024/1/20 23:12
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
#define siz(x) (t[x].siz)
#define ls(x) (t[x].ls)
#define rs(x) (t[x].rs)
#define key(x) (t[x].key)
#define pri(x) (t[x].pri)
struct node{
	int ls, rs, key, pri, siz;
}t[N << 6];
int tsiz = 0;
int root[N];
void update(int rt){
	siz(rt) = siz(ls(rt)) + siz(rs(rt)) + 1;
}
int newnode(int x = 0){
	++tsiz;
	siz(tsiz) = 1;
	ls(tsiz) = rs(tsiz) = 0;
	key(tsiz) = x;
	pri(tsiz) = rand();
	return tsiz;
}
void split(int rt, int x, int &l, int &r){
	if (rt == 0){
		l = r = 0;
		return;
	}
	if (key(rt) <= x){
		int id = newnode();
		t[id] = t[x];
		split(rs(id), x, rs(id), r);
		update(id);
	}
	else{
		int id = newnode();
		t[id] = t[x];
		split(ls(id), x, l, ls(id));
		update(id);
	}
}
int merge(int l, int r){
	if (l == 0 || r == 0) return l + r;
	if (pri(l) > pri(r)){
		int id = newnode();
		t[id] = t[l];
		rs(id) = merge(rs(id), r);
		update(id);
		return id;
	}
	else{
		int id = newnode();
		t[id] = t[r];
		ls(id) = merge(l, ls(id));
		update(id);
		return id;
	}
}
void insert(int &root, int x){
	int l, r;
	split(root, x, l, r);
	newnode(x);
	root = merge(merge(l, tsiz), r);
}
void del(int &root, int x){
	int l, m, r;
	split(root, x, l, r);
	split(l, x - 1, l, m);
	m = merge(ls(m), rs(m));
	root = merge(merge(l, m), r);
}
int getrank(int &root, int x){
	int l, r, res;
	split(root, x - 1, l, r);
	res = siz(l) + 1;
	root = merge(l, r);
	return res;
}
int kth(int rt, int k){
	if (k == siz(ls(rt)) + 1) return key(rt);
	if (k <= siz(ls(rt))) return kth(ls(rt), k);
	return kth(rs(rt), k - siz(ls(rt)) - 1);
}
int pre(int &root, int x){
	int l, r, res, k;
	split(root, x - 1, l, r);
	if (!l) return -2147483647;
	res = kth(l, siz(l));
	root = merge(l, r);
	return res;
}	
int suf(int &root, int x){
	int l, r, res;
	split(root, x, l, r);
	if (!r) return 2147483647;
	res = kth(r, 1);
	root = merge(l, r);
	return res;
}
int main(){
	srand(time(NULL));
	int q;
	cin >> q;
	for (int i = 1;i <= q;i++){
		int v, op, x;
		cin >> v >> op >> x;
		root[i] = root[v];
		if (op == 1) insert(root[i], x);
		else if (op == 2) del(root[i], x);
		else if (op == 3) cout << getrank(root[i], x) << '\n';
		else if (op == 4) cout << kth(root[i], x) << '\n';
		else if (op == 5) cout << pre(root[i], x) << '\n';
		else cout << suf(root[i], x) << '\n';
	}
	return 0;
}
2024/1/20 23:12
加载中...