FHQ全WA求助
查看原帖
FHQ全WA求助
908424
Walrus楼主2024/7/12 10:21
#include <bits/stdc++.h>
#define int long long
#define rep(i, j, k) for(int i = j; i <= k; ++i)
#define pb push_back
using namespace std;

const int N = 4e5 + 5;

namespace FHQ {
	struct node {
		int l, r;
		int key, val;
		int siz, tag;

#define l(p) t[p].l
#define r(p) t[p].r
#define key(p) t[p].key
#define val(p) t[p].val
#define siz(p) t[p].siz
#define tag(p) t[p].tag
	} t[N];

#define ls (p << 1)
#define rs (p << 1 | 1)

	int cnt = 0, rt = 0;

	void pushup(int p) {
		siz(p) = siz(l(p)) + siz(r(p)) + 1;
	}

	void pushdown(int p) {
		if(tag(p)) {
			swap(l(p), r(p));
			tag(l(p)) ^= 1, tag(r(p)) ^= 1;
			tag(p) = 0;
		}
	}

	int get_node(int val) {
		int p = ++cnt;
		key(p) = val;
		val(p) = rand();
		siz(p) = 1;
		return p;
	}

	void split(int p, int key, int &x, int &y) {
		if(p == 0)
			return x = y = 0, void();
		pushdown(p);
		if(key(p) <= key)
			x = p, split(r(p), key, r(p), y);
		else
			y = p, split(l(p), key, x, l(y));
		pushup(p);
	}

	int merge(int x, int y) {
		if(!x || !y) return x | y;
		pushdown(x), pushdown(y);
		if(val(x) > val(y))
			return r(x) = merge(r(x), y), pushup(x), x;
		else
			return l(y) = merge(x, l(y)), pushup(y), y;
	}

	void insert(int key) {
		int x, y;
		split(rt, key - 1, x, y);
		int p = get_node(key);
		rt = merge(merge(x, p), y);
	}

	void remove(int key) {
		int x, y, z;
		split(rt, key - 1, x, y), split(y, key, y, z);
		if(y) y = merge(l(y), r(y));
		rt = merge(merge(x, y), z);
	}

	int rank(int key) {
		int x, y, res;
		split(rt, key - 1, x, y);
		res = siz(x) + 1;
		rt = merge(x, y);
		return res;
	}

	int value(int val) {
		int p = rt;
		while(p) {
			if(siz(l(p)) + 1 == val) break;
			else if(siz(l(p)) + 1 > val) p = l(p);
			else  {
				val -= siz(l(p)) + 1, p = r(p);
			}
		}
		return key(p);
	}

	int get_pre(int key) {
		int x, y, p;
		split(rt, key - 1, x, y);
		p = x;
		while(r(p)) p = r(p);
		rt = merge(x, y);
		return key(p);
	}

	int get_nxt(int key) {
		int x, y, p;
		split(rt, key, x, y);
		p = y;
		while(l(p)) p = l(p);
		rt = merge(x, y);
		return key(p);
	}

	void reverse(int l, int r) {
		int x, y, p;
		split(rt, l - 1, x, y), split(y, r, p, y);
		tag(p) ^= 1;
		rt = merge(merge(x, p), y);
	}
	
	void print(int p) {
		if(!p) return;
		pushdown(p);
		print(l(p));
		cout << key(p) << ' ';
		print(r(p));
	}
}

using namespace FHQ;

int n, q, op, x, l, r;

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr), cout.tie(nullptr);

	srand((unsigned)time(0));
	
//	freopen("std.in", "r", stdin);
	
	cin >> n >> q;
	rep(i, 1, n) insert(i);
	while(q--) cin >> l >> r, reverse(l, r);
	
	print(rt);
	
	return 0;
}
2024/7/12 10:21
加载中...