CSES - E4590 2018 5 - Results
Submission details
Task:Reversals
Sender:Pohjantahti
Submission time:2018-10-13 14:22:11 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.50 sdetails

Code

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>

using namespace std;
typedef long long ll;

struct node {
	char val;
	int prio, size;
	bool lzinv;
	node *left, *right;

	node (char v) {
		val = v;
		prio = rand();
		size = 1;
		lzinv = false;
		left = nullptr;
		right = nullptr;
	}
};

int gsize(node *s) {
	if (s == nullptr) return 0;
	return s->size;
}

void upd(node *s) {
	if (s == nullptr) return;
	s-> size = gsize(s->left) + 1 + gsize(s->right);
}

void push(node *s) {
	if (s == nullptr) return;

	if (s->lzinv) {
		swap(s->left, s->right);
	}

	if (s->left != nullptr) {
		if (s->lzinv) {
			s->left->lzinv = !s->left->lzinv;
		}
	}
	if (s->right != nullptr) {
		if (s->lzinv) {
			s->right->lzinv = !s->right->lzinv;
		}
	}
	s->lzinv = false;
}

void split(node *t, node *&l, node *&r, int k) {
	push(t);
	if (t == nullptr) {
		l = nullptr;
		r = nullptr;
		return;
	}
	if (k >= gsize(t->left)+1) {
		split(t->right, t->right, r, k-(gsize(t->left)+1));
		l = t;
	}
	else {
		split(t->left, l, t->left, k);
		r = t;
	}
	upd(t);
}

void merge(node *&t, node *l, node *r) {
	push(l);
	push(r);
	if (l == nullptr) {
		t = r;
	}
	else if (r == nullptr) {
		t = l;
	}
	else {
		if (l->prio >= r->prio) {
			merge(l->right, l->right, r);
			t = l;
		}
		else {
			merge(r->left, l, r->left);
			t = r;
		}
	}
	upd(t);
}

void rangeInv(node *&t, int a, int b) {
	node *cl, *cur, *cr;
	int tsz = gsize(t);
	bool lsplit = false;
	bool rsplit = false;
	cur = t;
	if (a > 1) {
		split(cur, cl, cur, a-1);
		lsplit = true;
	}
	if (b < tsz) {
		split(cur, cur, cr, b-a+1);
		rsplit = true;
	}
	cur->lzinv = !cur->lzinv;
	if (lsplit) {
		merge(cur, cl, cur);
	}
	if (rsplit) {
		merge(cur, cur, cr);
	}
	t = cur;
}

string trav(node *s) {
	push(s);
	string res = "";
	if (s == nullptr) return res;
	res += trav(s->left);
	res += s->val;
	res += trav(s->right);
	return res;
}

int n, m;
string cs;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	srand(time(NULL));
	cin >> n >> m;
	cin >> cs;

	node *tree = nullptr;
	for (int i = 1; i <= n; ++i) {
		node *nw = new node(cs[i-1]);
		merge(tree, tree, nw);
	}

	for (int i = 0; i < m; ++i) {
		int a, b;
		cin >> a >> b;
		rangeInv(tree, a, b);
	}

	string res = trav(tree);
	cout << res << "\n";
	return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
50 100
pplcmurzajsxlqqcrxewfhzqyihkzp...

correct output
fpuwlmatkzbhksppmjxpwurcvsdxcz...

user output
fpuwlmatkzbhksppmjxpwurcvsdxcz...

Test 2

Verdict: ACCEPTED

input
500000 100000
slsmyuezdrenskmgkwxpcfzistssmu...

correct output
slsmyuezvdfzhssyoofpsnsagrrzri...

user output
slsmyuezvdfzhssyoofpsnsagrrzri...