Rt,TLE on test 14
#include <bits/stdc++.h>
#define mid (((l) + (r)) >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
using namespace std;
const int N = 1e5 + 10;
struct node
{
int sum, lazy;
} tr[26][N << 2];
string ch;
void build(int cl, int rt, int l, int r)
{
if (l == r)
{
tr[cl][rt].sum = ch[l - 1] == 'a' + cl, tr[cl][rt].lazy = -1;
return;
}
build(cl, lson);
build(cl, rson);
tr[cl][rt].sum = tr[cl][rt << 1].sum + tr[cl][rt << 1 | 1].sum;
tr[cl][rt].lazy = -1;
}
void pushdown(int cl, int rt, int l, int r)
{
if (tr[cl][rt].lazy != -1)
{
tr[cl][rt << 1].lazy = tr[cl][rt].lazy, tr[cl][rt << 1].sum = (mid - l + 1) * tr[cl][rt].lazy;
tr[cl][rt << 1 | 1].lazy = tr[cl][rt].lazy, tr[cl][rt << 1 | 1].sum = (r - mid) * tr[cl][rt].lazy;
tr[cl][rt].lazy = -1;
}
}
void change(int cl, int rt, int l, int r, int L, int R, int K)
{
if (L <= l && R >= r)
{
tr[cl][rt].sum = (r - l + 1) * K;
tr[cl][rt].lazy = K;
return;
}
pushdown(cl, rt, l, r);
if (L <= mid)
change(cl, lson, L, R, K);
if (R > mid)
change(cl, rson, L, R, K);
tr[cl][rt].sum = tr[cl][rt << 1].sum + tr[cl][rt << 1 | 1].sum;
}
void modify(int cl, int rt, int l, int r, int T, int K)
{
if (l == r)
{
tr[cl][rt].sum = K;
tr[cl][rt].lazy = -1;
return;
}
pushdown(cl, rt, l, r);
if (T <= mid)
modify(cl, lson, T, K);
else
modify(cl, rson, T, K);
tr[cl][rt].sum = tr[cl][rt << 1].sum + tr[cl][rt << 1 | 1].sum;
}
int query(int cl, int rt, int l, int r, int L, int R)
{
if (L <= l && R >= r)
return tr[cl][rt].sum;
int ans = 0;
pushdown(cl, rt, l, r);
if (L <= mid)
ans += query(cl, lson, L, R);
if (R > mid)
ans += query(cl, rson, L, R);
return ans;
}
int main()
{
// freopen("input.in", "r", stdin);
// freopen("output.out", "w", stdout);
int n, m;
cin >> n >> m;
cin >> ch;
for (int i = 0; i < 26; ++i)
{
build(i, 1, 1, n);
}
// for (int i = 1; i <= n; ++i)
// {
// for (int j = 0; j < 26; ++j)
// {
// if (query(j, 1, 1, n, i, i))
// {
// putchar('a' + j);
// break;
// }
// }
// }
// cout << "nmsl" << endl;
for (int i = 1; i <= m; ++i)
{
int l, r;
int odd = 0, t;
cin >> l >> r;
int pd[26], pd_r[26];
memset(pd, 0, sizeof(pd));
for (int j = 0; j < 26; ++j)
{
pd[j] = query(j, 1, 1, n, l, r);
if (pd[j] & 1)
++odd, t = j;
}
// for (int j = 0; j < 26; ++j)
// printf("%d ", pd[j]);
// puts("");
if (odd > 1 || (odd == 0 && l % 2 == r % 2) || (odd == 1 && l % 2 != r % 2))
continue;
// cout << " " << l << " " << r << endl;
for (int j = 0; j < 26; ++j)
change(j, 1, 1, n, l, r, 0);
if (odd == 1)
{
modify(t, 1, 1, n, (l + r) >> 1, 1);
pd[t]--;
}
for (int j = 0; j < 26; ++j)
pd[j] /= 2, pd_r[j] = pd[j];
int reg = 0;
for (int j = l; j < (l + r) >> 1; ++j)
{
while (!pd[reg])
++reg;
modify(reg, 1, 1, n, j, 1);
--pd[reg];
}
if(odd==0)
{
while(!pd[reg]) ++reg;
modify(reg, 1, 1, n, (l + r) >> 1, 1);
--pd[reg];
}
reg = 25;
for (int j = ((l + r) >> 1) + 1; j <= r; ++j)
{
while (!pd_r[reg])
--reg;
modify(reg, 1, 1, n, j, 1);
--pd_r[reg];
}
}
for (int i = 1; i <= n; ++i)
{
for (int j = 0; j < 26; ++j)
{
if (query(j, 1, 1, n, i, i))
{
putchar('a' + j);
break;
}
}
}
return 0;
}