#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// Bài này mấy em cần học qua thuật toán Counting Sort - đây là một thuật toán sắp xếp phổ biến
// Và kết hợp với Segment Tree để tối ưu thuật toán này
// 26 cây Segment Tree cho 26 chữ cái, seg[c] sẽ quản lí những vị trí i sao cho s[i] = c
const int N = 1e5 + 5;
int n, q;
string s;
struct segTree {
int n;
vector<int> seg, lazy;
segTree() {}
segTree(int n): n(n) {
seg.resize(4 * n + 1, 0);
lazy.resize(4 * n + 1, -1);
}
void push(int id, int l, int r) {
if (lazy[id] != -1) {
int mid = (l + r) >> 1;
seg[id * 2] = (mid - l + 1) * lazy[id];
lazy[id * 2] = lazy[id];
seg[id * 2 + 1] = (r - mid) * lazy[id];
lazy[id * 2 + 1] = lazy[id];
lazy[id] = -1;
}
}
void update(int id, int l, int r, int u, int v, int val) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
seg[id] = (r - l + 1) * val;
lazy[id] = val;
return;
}
push(id, l, r);
int mid = (l + r) >> 1;
update(id * 2, l, mid, u, v, val);
update(id * 2 + 1, mid + 1, r, u, v, val);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
int get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return seg[id];
push(id, l, r);
int mid = (l + r) >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
};
segTree seg[26];
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> q;
cin >> s;
s = ' ' + s;
for (int c = 0; c <= 25; c++) seg[c] = segTree(n);
for (int i = 1; i <= n; i++) {
seg[s[i] - 'a'].update(1, 1, n, i, i, 1);
}
while (q--) {
int l, r, type;
cin >> l >> r >> type;
vector<int> cnt(26, 0);
for (int c = 0; c <= 25; c++) {
cnt[c] = seg[c].get(1, 1, n, l, r);
seg[c].update(1, 1, n, l, r, 0);
}
if (type == 0) {
// non-increasing order
for (int c = 25; c >= 0; c--) {
seg[c].update(1, 1, n, l, l + cnt[c] - 1, 1);
l += cnt[c];
}
}
else {
// non-decreasing order
for (int c = 0; c <= 25; c++) {
seg[c].update(1, 1, n, l, l + cnt[c] - 1, 1);
l += cnt[c];
}
}
}
for (int i = 1; i <= n; i++) {
for (int c = 0; c <= 25; c++) {
if (seg[c].get(1, 1, n, i, i) == 1) s[i] = c + 'a';
}
}
for (int i = 1; i <= n; i++) cout << s[i];
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgovLyBCw6BpIG7DoHkgbeG6pXkgZW0gY+G6p24gaOG7jWMgcXVhIHRodeG6rXQgdG/DoW4gQ291bnRpbmcgU29ydCAtIMSRw6J5IGzDoCBt4buZdCB0aHXhuq10IHRvw6FuIHPhuq9wIHjhur9wIHBo4buVIGJp4bq/bgovLyBWw6Aga+G6v3QgaOG7o3AgduG7m2kgU2VnbWVudCBUcmVlIMSR4buDIHThu5FpIMawdSB0aHXhuq10IHRvw6FuIG7DoHkKLy8gMjYgY8OieSBTZWdtZW50IFRyZWUgY2hvIDI2IGNo4buvIGPDoWksIHNlZ1tjXSBz4bq9IHF14bqjbiBsw60gbmjhu69uZyB24buLIHRyw60gaSBzYW8gY2hvIHNbaV0gPSBjCgpjb25zdCBpbnQgTiA9IDFlNSArIDU7ICAKCmludCBuLCBxOyAKc3RyaW5nIHM7ICAKCnN0cnVjdCBzZWdUcmVlIHsKCWludCBuOyAKCXZlY3RvcjxpbnQ+IHNlZywgbGF6eTsgICAKCglzZWdUcmVlKCkge30KCglzZWdUcmVlKGludCBuKTogbihuKSB7CgkJc2VnLnJlc2l6ZSg0ICogbiArIDEsIDApOyAgIAoJCWxhenkucmVzaXplKDQgKiBuICsgMSwgLTEpOyAKCX0KCgl2b2lkIHB1c2goaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKCQlpZiAobGF6eVtpZF0gIT0gLTEpIHsKCQkJaW50IG1pZCA9IChsICsgcikgPj4gMTsKCgkJCXNlZ1tpZCAqIDJdID0gKG1pZCAtIGwgKyAxKSAqIGxhenlbaWRdOyAKCQkJbGF6eVtpZCAqIDJdID0gbGF6eVtpZF07IAoKCQkJc2VnW2lkICogMiArIDFdID0gKHIgLSBtaWQpICogbGF6eVtpZF07ICAKCQkJbGF6eVtpZCAqIDIgKyAxXSA9IGxhenlbaWRdOyAgCgoJCQlsYXp5W2lkXSA9IC0xOyAgCgkJfQoJfQoKCXZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCB2YWwpIHsKCQlpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybjsgICAKCgkJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKCQkJc2VnW2lkXSA9IChyIC0gbCArIDEpICogdmFsOyAgCgkJCWxhenlbaWRdID0gdmFsOyAKCQkJcmV0dXJuOyAKCQl9CgoJCXB1c2goaWQsIGwsIHIpOyAgIAoKCQlpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCQl1cGRhdGUoaWQgKiAyLCBsLCBtaWQsIHUsIHYsIHZhbCk7IAoJCXVwZGF0ZShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2LCB2YWwpOyAKCgkJc2VnW2lkXSA9IHNlZ1tpZCAqIDJdICsgc2VnW2lkICogMiArIDFdOyAKCX0KCglpbnQgZ2V0KGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpIHsKCQlpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAwOyAgIAoKCQlpZiAodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIHNlZ1tpZF07ICAKCgkJcHVzaChpZCwgbCwgcik7ICAgCgoJCWludCBtaWQgPSAobCArIHIpID4+IDE7ICAKCQlyZXR1cm4gZ2V0KGlkICogMiwgbCwgbWlkLCB1LCB2KSArIGdldChpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsgCgl9Cn07IAoKc2VnVHJlZSBzZWdbMjZdOyAKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7ICAJCgljaW4gPj4gbiA+PiBxOyAKCWNpbiA+PiBzOyAKCXMgPSAnICcgKyBzOyAgCgoJZm9yIChpbnQgYyA9IDA7IGMgPD0gMjU7IGMrKykgc2VnW2NdID0gc2VnVHJlZShuKTsgIAoKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCXNlZ1tzW2ldIC0gJ2EnXS51cGRhdGUoMSwgMSwgbiwgaSwgaSwgMSk7IAoJfQkKCgl3aGlsZSAocS0tKSB7CgkJaW50IGwsIHIsIHR5cGU7IAoJCWNpbiA+PiBsID4+IHIgPj4gdHlwZTsgCgoJCXZlY3RvcjxpbnQ+IGNudCgyNiwgMCk7ICAKCQlmb3IgKGludCBjID0gMDsgYyA8PSAyNTsgYysrKSB7CgkJCWNudFtjXSA9IHNlZ1tjXS5nZXQoMSwgMSwgbiwgbCwgcik7ICAgCgkJCXNlZ1tjXS51cGRhdGUoMSwgMSwgbiwgbCwgciwgMCk7IAoJCX0KCgkJaWYgKHR5cGUgPT0gMCkgewoJCQkvLyBub24taW5jcmVhc2luZyBvcmRlcgoJCQlmb3IgKGludCBjID0gMjU7IGMgPj0gMDsgYy0tKSB7CgkJCQlzZWdbY10udXBkYXRlKDEsIDEsIG4sIGwsIGwgKyBjbnRbY10gLSAxLCAxKTsKCQkJCWwgKz0gY250W2NdOyAJCgkJCX0KCQl9CgkJZWxzZSB7CgkJCS8vIG5vbi1kZWNyZWFzaW5nIG9yZGVyCgkJCWZvciAoaW50IGMgPSAwOyBjIDw9IDI1OyBjKyspIHsKCQkJCXNlZ1tjXS51cGRhdGUoMSwgMSwgbiwgbCwgbCArIGNudFtjXSAtIDEsIDEpOyAgCgkJCQlsICs9IGNudFtjXTsgCgkJCX0KCQl9Cgl9CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgYyA9IDA7IGMgPD0gMjU7IGMrKykgewoJCQlpZiAoc2VnW2NdLmdldCgxLCAxLCBuLCBpLCBpKSA9PSAxKSBzW2ldID0gYyArICdhJzsgICAgCgkJfQoJfQoKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY291dCA8PCBzW2ldOyAKfQ==