#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // C++ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #define _GLIBCXX_DEBUG #define rep(i, n) for(int i=0;i<(int)(n);i++) #define pb push_back #define pob pop_back #define eb emplace_back #define nall(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define yesno(a) cout<<(a?"YES\n":"NO\n") #define accu accumulate #define bs binary_search #define lb lower_bound #define ub upper_bound #define yes cout<<"YES\n" #define no cout<<"NO\n" using namespace std; using ll = long long; using ull = unsigned long long; using pii = pair; using pll = pair; template using pq = priority_queue; template using pqg = priority_queue, greater>; template using vec = vector; template using vv = vector>; template using vvv = vector>; const ll MOD = 998244353ll; // const ll MOD = 1000000007ll; void solve(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(20); int t = 1; // cin >> t; while (t--) solve(); return 0; } void solve(){ int N, Q; string S; cin >> N >> Q >> S; array, 26> A; rep(i, 26) A[i].insert(N); rep(i, N) A[S[i]-'a'].insert(i); while (Q--){ int t; cin >> t; if (t == 1){ int i; char c; cin >> i >> c, i--; A[S[i]-'a'].erase(i); A[c-'a'].insert(i); } else{ string s; int now = -1; bool ok = true; cin >> s; for (char c : s){ now = *A[c-'a'].ub(now); if (now == N){ ok = false; break; } } cout << (ok? "Yes": "No") << endl; } } }