#include <bits/stdc++.h>   using namespace std;   namespace io {   const int l = 1 << 19;   char buf[l], *s, *t, c;   char gc() {     if (s == t) {       t = (s = buf) + fread(buf, 1, l, stdin);       return s == t ? EOF : *s++;     }     return *s++;   }   template <class I>   void gi(I &x) {     x = 0;     c = gc();     while (c <  0  || c >  9 ) c = gc();     while ( 0  <= c && c <=  9 ) {       x = (x << 1) + (x << 3) + (c ^ 48);       c = gc();     }   }   };  // namespace io   using io::gi;   const int N = 100005;   int n, q, s[N], dp[251][251][251];   int t1, t2, t3, s1[N], s2[N], s3[N];   char ss[N];   set<int> S[26];   void upd(int &a, int b) {     if (a == -1 || a > b) a = b;   }   int main() {     scanf( %d%d%s , &n, &q, ss + 1);     for (int i = 1; i <= n; i++) {       s[i] = ss[i] -  a ;       S[s[i]].insert(i);     }     memset(dp, -1, sizeof(dp));     dp[0][0][0] = 0;     while (q--) {       char A[3], C[3];       int b, c;       set<int>::iterator v;       scanf( %s%d , A, &b);       if (A[0] ==  - ) {         if (b == 1) --t1;         if (b == 2) --t2;         if (b == 3) --t3;       } else {         scanf( %s , C);         c = C[0] -  a ;         if (b == 1) {           s1[++t1] = c;           for (int i = t1; i <= t1; i++)             for (int j = 0; j <= t2; j++)               for (int k = 0; k <= t3; k++) {                 dp[i][j][k] = -1;                 if (i && dp[i - 1][j][k] != -1) {                   v = S[s1[i]].upper_bound(dp[i - 1][j][k]);                   if (v != S[s1[i]].end()) upd(dp[i][j][k], *v);                 }                 if (j && dp[i][j - 1][k] != -1) {                   v = S[s2[j]].upper_bound(dp[i][j - 1][k]);                   if (v != S[s2[j]].end()) upd(dp[i][j][k], *v);                 }                 if (k && dp[i][j][k - 1] != -1) {                   v = S[s3[k]].upper_bound(dp[i][j][k - 1]);                   if (v != S[s3[k]].end()) upd(dp[i][j][k], *v);                 }               }         }         if (b == 2) {           s2[++t2] = c;           for (int i = 0; i <= t1; i++)             for (int j = t2; j <= t2; j++)               for (int k = 0; k <= t3; k++) {                 dp[i][j][k] = -1;                 if (i && dp[i - 1][j][k] != -1) {                   v = S[s1[i]].upper_bound(dp[i - 1][j][k]);                   if (v != S[s1[i]].end()) upd(dp[i][j][k], *v);                 }                 if (j && dp[i][j - 1][k] != -1) {                   v = S[s2[j]].upper_bound(dp[i][j - 1][k]);                   if (v != S[s2[j]].end()) upd(dp[i][j][k], *v);                 }                 if (k && dp[i][j][k - 1] != -1) {                   v = S[s3[k]].upper_bound(dp[i][j][k - 1]);                   if (v != S[s3[k]].end()) upd(dp[i][j][k], *v);                 }               }         }         if (b == 3) {           s3[++t3] = c;           for (int i = 0; i <= t1; i++)             for (int j = 0; j <= t2; j++)               for (int k = t3; k <= t3; k++) {                 dp[i][j][k] = -1;                 if (i && dp[i - 1][j][k] != -1) {                   v = S[s1[i]].upper_bound(dp[i - 1][j][k]);                   if (v != S[s1[i]].end()) upd(dp[i][j][k], *v);                 }                 if (j && dp[i][j - 1][k] != -1) {                   v = S[s2[j]].upper_bound(dp[i][j - 1][k]);                   if (v != S[s2[j]].end()) upd(dp[i][j][k], *v);                 }                 if (k && dp[i][j][k - 1] != -1) {                   v = S[s3[k]].upper_bound(dp[i][j][k - 1]);                   if (v != S[s3[k]].end()) upd(dp[i][j][k], *v);                 }               }         }       }       if (dp[t1][t2][t3] == -1)         puts( NO );       else         puts( YES );     }     return 0;   }