CSES - Shared codeLink to this code:
https://cses.fi/paste/695ccf4c2fc0a9521c5235/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <set>
#include <cstring>
#include <math.h>
#include <iomanip>
#include <queue>
#include <map>
#include <bitset>
#include <unordered_map>
#define LL long long
#define ULL unsigned long long
#define FOR(i, a, b) for (int i = a; i < b; ++i)
#define REP(i, a, b) for (int i = a; i <= b; ++i)
#define FORD(i, a, b) for (int i = (a) - 1; i >= (b); --i)
#define REPD(i, a, b) for (int i = (a); i >= (b); --i)
#define X first
#define Y second
#define pb(a) push_back(a);
#define pii pair<int, int>
#define pLi pair<LL, int>
#define piL pair<int, LL>
#define pLL pair<LL, LL>
#define ar array
#define ef else if
using namespace std;
const int mxn = 2e5 + 5;
const int MOD = 1e9 + 7;
const int BASE = 10000;
const int INF = 1000000000;
struct node
{
int cnt, p;
char x;
bool flip;
node *l, *r;
node (char ch)
{
x = ch;
flip = 0;
cnt = 0;
p = rand();
l = r = NULL;
}
};
int cnt (node *t)
{
return (t ? t->cnt : 0);
}
void upd (node *t)
{
if (!t) return;
t->cnt = 1 + cnt(t->l) + cnt(t->r);
}
void down (node *t)
{
if (!t || t->flip == 0) return;
node *&l = t->l, *&r = t->r;
swap(l, r);
if (l) l->flip ^= 1;
if (r) r->flip ^= 1;
t->flip = 0;
}
void split (node *t, int key, node *&a, node *&b, int add = 0)
{
if (!t) {a = b = NULL; return;}
down(t);
if (cnt(t->l) + 1 + add <= key)
{
split(t->r, key, t->r, b, add + cnt(t->l) + 1);
a = t;
upd(a);
}
else
{
split(t->l, key, a, t->l, add);
b = t;
upd(b);
}
}
node *merge (node *a, node *b)
{
if (!a || !b)
return (a ? a : b);
if (a->p <= b->p)
{
down(a);
a->r = merge(a->r, b);
upd(a);
return a;
}
else
{
down(b);
b->l = merge(a, b->l);
upd(b);
return b;
}
}
void insert (node *&t, node *a)
{
if (!t) { t = a; t->cnt = 1; }
ef (t->p <= a->p)
{
insert(t->r, a);
upd(t);
}
else
{
a->l = t;
upd(a);
t = a;
}
}
void dfs (node *t)
{
if (!t) return;
down(t);
dfs(t->l);
cout << t->x;
dfs(t->r);
}
void update (node *&t, int l, int r)
{
node *a = NULL, *b = NULL, *c = NULL, *d = NULL;
split(t, l - 1, a, b);
split(b, r - l + 1, c, d);
if (c) c->flip ^= 1;
b = merge(c, d);
t = merge(a, b);
}
int main()
{
//freopen("D:\\test.txt", "r", stdin);
//freopen("D:\\test2.txt", "w", stdout);
int n, m;
cin >> n >> m;
char x;
cin >> x;
node *t = new node(x);
REP(i, 2, n)
{
cin >> x;
node *a = new node(x);
insert(t, a);
}
REP(i, 1, m)
{
int l, r;
cin >> l >> r;
update(t, l, r);
}
dfs(t);
}