#include <bits/stdc++.h>   using namespace std;   const long long mod1 = 19260817;   const long long mod2 = 19660813;   int n;   int m;   char s[200005];   char opt[5];   struct {     int tree[200005];     int lowbit(int x) { return x & -x; }     void ins(int pos, int val) {       for (; pos <= n; pos += lowbit(pos)) tree[pos] += val;     }     int query(int pos) {       int sum = 0;       for (; pos; pos -= lowbit(pos)) sum += tree[pos];       return sum;     }   } t[125];   int find(int x) {     int ret = 0;     for (int i = 20; i >= 0; --i) {       if (ret + (1 << i) > n) continue;       int sum = 0;       for (int j = 48; j < 125; ++j) sum += t[j].tree[ret + (1 << i)];       if (x >= sum) {         x -= sum;         ret += (1 << i);       }     }     return ret;   }   set<int> book[125];   set<int>::iterator it;   vector<int> memo;   bool check(int pos) {     if (pos == 1) {       if (t[s[pos]].query(pos)) return true;     } else {       if (t[s[pos]].query(pos) - t[s[pos]].query(pos - 1)) return true;     }     return false;   }   int main() {     scanf( %d %d , &n, &m);     scanf( %s , s + 1);     for (int i = 1; i <= n; ++i) {       t[s[i]].ins(i, 1);       book[s[i]].insert(i);     }     while (m--) {       int l;       int r;       scanf( %d %d %s , &l, &r, opt + 1);       int lcur = find(l - 1) + 1;       int rcur = find(r - 1) + 1;       it = book[opt[1]].lower_bound(lcur);       memo.clear();       while (it != book[opt[1]].end()) {         int pos = *it;         if (pos > rcur) break;         memo.push_back(pos);         ++it;       }       for (auto p : memo) book[opt[1]].erase(p);       for (auto p : memo) t[opt[1]].ins(p, -1);     }     for (int i = 1; i <= n; ++i) {       if (check(i)) printf( %c , s[i]);     }     printf(  n );     return 0;   }   