如题 求调
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
struct SegmentTree {
#define mid ((l + r) >> 1)
#define ls p << 1, l, mid
#define rs p << 1 | 1, mid + 1, r
int n;
int cnt[26][N << 2];
int lazy[N << 2];
SegmentTree() {
memset(cnt, 0, sizeof(cnt));
memset(lazy, -1, sizeof(lazy));
}
inline void pushup(int p) {
for (int i = 0; i < 26; ++i) {
cnt[i][p] = cnt[i][p << 1] + cnt[i][p << 1 | 1];
}
}
inline void build(int p, int l, int r, char s[]) {
if (l == r) {
cnt[s[l] - 'a'][p] = 1;
return;
}
build(ls, s);
build(rs, s);
pushup(p);
}
inline void pushdown(int p, int l, int r) {
if (lazy[p] == -1)
return;
for (int i = 0; i < 26; ++i) {
cnt[i][p << 1] = 0;
cnt[i][p << 1 | 1] = 0;
}
cnt[lazy[p]][p << 1] = (l - mid + 1);
cnt[lazy[p]][p << 1 | 1] = r - mid;
lazy[p << 1] = lazy[p << 1 | 1] = lazy[p];
lazy[p] = -1;
}
inline void modify(int p, int l, int r, int L, int R, int x) {
if (l > R || r < L)
return;
if (L <= l && r <= R) {
for (int i = 0; i < 26; ++i) {
cnt[i][p] = 0;
}
cnt[x][p] = (r - l + 1);
lazy[p] = x;
return;
}
pushdown(p, l, r);
modify(ls, L, R, x);
modify(rs, L, R, x);
pushup(p);
}
inline void query(int p, int l, int r, int L, int R, int t[]) {
if (l > R || r < L)
return;
if (L <= l && r <= R) {
for (int i = 0; i < 26; ++i) {
t[i] += cnt[i][p];
}
return;
}
pushdown(p, l, r);
query(ls, L, R, t);
query(rs, L, R, t);
}
inline void prt(int p, int l, int r, char s[]) {
if (l == r) {
for (int i = 0; i < 26; ++i) {
if (cnt[i][p]) {
s[l] = i + 'a';
return;
}
}
}
pushdown(p, l, r);
prt(ls, s);
prt(rs, s);
}
inline void build(int n_, char ch[]) { n = n_, build(1, 1, n, ch); }
inline void query(int l, int r, int t[]) { query(1, 1, n, l, r, t); }
inline void modify(int l, int r, int x) {
l <= r ? modify(1, 1, n, l, r, x) : void();
}
inline void prt(char s[]) { prt(1, 1, n, s); }
};
char s[N];
SegmentTree sgt;
int main() {
int n, m;
cin >> n >> m;
cin >> (s + 1);
sgt.build(n, s);
int t[26];
while (m--) {
int l, r, op;
cin >> l >> r >> op;
memset(t, 0, sizeof(t));
sgt.query(l, r, t);
int cur = l;
if (op == 1) {
for (int i = 0; i < 26; ++i) {
sgt.modify(cur, cur + t[i] - 1, i);
cur += t[i];
}
} else {
for (int i = 25; i >= 0; --i) {
sgt.modify(cur, cur + t[i] - 1, i);
cur += t[i];
}
}
}
sgt.prt(s);
cout << (s + 1) << "\n";
return 0;
}