#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
string s;
cin >> s;
// upL[c]: 从小写开始,最终是否为大写;初始为小写(false)
// upU[c]: 从大写开始,最终是否为大写;初始为大写(true)
array<char, 26> upL{}, upU{};
upL.fill(0);
upU.fill(1);
for (int i = 0; i < m; ++i) {
int op;
char L, R;
cin >> op >> L >> R;
if (op == 1) {
int l = L - 'a', r = R - 'a';
for (int c = l; c <= r; ++c) {
// 只有当前是小写的才会被转成大写
if (!upL[c]) upL[c] = 1;
if (!upU[c]) upU[c] = 1; // 起始为大写的路径若曾被降小写,也会被此操作升回大写
}
} else { // op == 2
int l = L - 'A', r = R - 'A';
for (int c = l; c <= r; ++c) {
// 只有当前是大写的才会被转成小写
if (upL[c]) upL[c] = 0;
if (upU[c]) upU[c] = 0;
}
}
}
// 将最终状态应用到字符串
for (char& ch : s) {
int idx = (ch >= 'a' ? ch - 'a' : ch - 'A');
bool startUpper = isupper(static_cast<unsigned char>(ch));
bool finalUpper = startUpper ? upU[idx] : upL[idx];
ch = finalUpper ? char('A' + idx) : char('a' + idx);
}
cout << s << '\n';
return 0;
}