fhq30分求调
查看原帖
fhq30分求调
347589
Zelotz楼主2022/5/24 23:23
#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define debug puts("------------------------------------")
#define mp make_pair
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace HOOOOOCH {
	template <typename T>
	il void read(T &x) {
		x = 0; T f = 1; char ch;
		while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
		while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
	}
	template <typename T, typename ...L>
	il void read(T &x, L &...y) {read(x); read(y...);}
	template <typename T>
	il void write(T x) {
		if (x < 0) ptc('-'), x = -x;
		if (x > 9) write(x / 10);
		ptc(x % 10 + '0');
	}
}
using namespace HOOOOOCH; 
const int N = 2e5 + 5;
#define int long long
int a[N], tot, q, cnt;
int root[N], X, Y, Z;
struct fhq_treap {
	struct node {
		int ls, rs, sz, rnd, sum, val, tag;
	} tr[N * 170];
	int make(int val) {return tr[++tot] = {0, 0, 1, rand(), val, val, 0}, tot;}
	void pushup(int id) {
		tr[id].sum = tr[tr[id].ls].sum + tr[tr[id].rs].sum + tr[id].val;
		tr[id].sz = tr[tr[id].ls].sz + tr[tr[id].rs].sz + 1;
	}
	int rev(int id) {
		int a = make(0); tr[a] = tr[id]; 
		tr[a].tag ^= 1;
		swap(tr[a].ls, tr[a].rs);
		return a;
	}
	void pushdown(int id) {
		if (!tr[id].tag) return ;
		if (tr[id].ls) tr[id].ls = rev(tr[id].ls);
		if (tr[id].rs) tr[id].rs = rev(tr[id].rs);
		tr[id].tag = 0;
	}
	void split(int &X, int &Y, int sz, int id) {
//		cout << id << endl;
		if (!id) return X = Y = 0, void();
		if (tr[tr[id].ls].sz + 1 < sz) {
			X = make(0);
			tr[X] = tr[id];
			pushdown(X);
			split(tr[X].rs, Y, sz - tr[tr[X].ls].sz - 1, tr[X].rs);
			pushup(X);
		}
		else {
			Y = make(0);
			tr[Y] = tr[id];
			pushdown(Y);
			split(X, tr[Y].ls, sz, tr[Y].ls);
			pushup(Y);
		}
	}
	int merge(int id1, int id2) {
		if (!id1 || !id2) return id1 | id2;
		if (tr[id1].rnd > tr[id2].rnd) {
			pushdown(id1);
			tr[id1].rs = merge(tr[id1].rs, id2);
			pushup(id1);
			return id1;
		} 
		pushdown(id2);
		tr[id2].ls = merge(id1, tr[id2].ls);
		pushup(id2);
		return id2;
	}
	void insert(int pos, int x) {
		split(X, Y, pos + 1, root[cnt]);
		root[cnt] = merge(X, merge(make(x), Y));
	}
	void erase(int pos) {
		split(X, Y, pos, root[cnt]);
		split(Y, Z, 2, Y);
		root[cnt] = merge(X, Z);
	}
	void reverse(int l, int r) {
		split(X, Y, l, root[cnt]);
		split(Y, Z, (r - l + 2), Y);
		Y = rev(Y);
		root[cnt] = merge(X, merge(Y, Z));
	}
	void print(int id) {
		if (!id) return ;
		pushdown(id);
		print(tr[id].ls), cout << tr[id].val << ' ', print(tr[id].rs);
	}
} tr;
signed main() {
//	freopen("in.in", "r", stdin);
//	freopen("out.out", "w", stdout);
	srand;
	read(q);
	int lst = 0;
	while (q--) {
		int op, x, y, z;
		read(z, op, x, y);
		x^= lst, y ^= lst;
		root[++cnt] = root[z];
		if (op == 1) tr.insert(x, y);
		else if (op == 2) tr.erase(x);
		else if (op == 3) tr.reverse(x, y);
		else {
			tr.split(X, Y, x, root[cnt]);
			tr.split(Y, Z, (y - x + 2), Y);
			write(tr.tr[Y].sum), ptc('\n'), lst = tr.tr[Y].sum;
			root[cnt] = tr.merge(X, tr.merge(Y, Z));
		}
	}
	return 0;
}
2022/5/24 23:23
加载中...