#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int p = 31;
const int MOD = 1e9 + 9277;
const int N = 2e5 + 5;
int n, q;
string s;
int p_pow[N];
void precompute() {
p_pow[0] = 1;
for (int i = 1; i <= n; i++) p_pow[i] = 1ll * p_pow[i - 1] * p % MOD;
}
struct Node {
int len = 0;
int h = 0, h_rev = 0;
Node() {}
Node(char c) {
len = 1;
h = h_rev = (c - 'a' + 1);
}
Node operator+(const Node& other) const {
Node ans;
ans.len = len + other.len;
ans.h = (1ll * h * p_pow[other.len] + other.h) % MOD;
ans.h_rev = (1ll * other.h_rev * p_pow[len] + h_rev) % MOD;
return ans;
}
};
Node seg[4 * N];
void build(int id, int l, int r) {
if (l == r) {
seg[id] = Node(s[l]);
return;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
void update(int id, int l, int r, int pos, char c) {
if (l > pos || r < pos) return;
if (l == r) {
seg[id] = Node(c);
return;
}
int mid = (l + r) >> 1;
update(id * 2, l, mid, pos, c);
update(id * 2 + 1, mid + 1, r, pos, c);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
Node get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return Node();
if (u <= l && r <= v) return seg[id];
int mid = (l + r) >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
cin >> s;
s = ' ' + s;
precompute();
build(1, 1, n);
while (q--) {
int type; cin >> type;
if (type == 1) {
int pos; char c;
cin >> pos >> c;
update(1, 1, n, pos, c);
}
else {
int l, r;
cin >> l >> r;
Node cur = get(1, 1, n, l, r);
cout << (cur.h == cur.h_rev ? "YES" : "NO") << '\n';
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IHAgPSAzMTsgCmNvbnN0IGludCBNT0QgPSAxZTkgKyA5Mjc3OyAgIApjb25zdCBpbnQgTiA9IDJlNSArIDU7ICAKCmludCBuLCBxOyAgIApzdHJpbmcgczsgIAoKaW50IHBfcG93W05dOyAKCnZvaWQgcHJlY29tcHV0ZSgpIHsKCXBfcG93WzBdID0gMTsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBwX3Bvd1tpXSA9IDFsbCAqIHBfcG93W2kgLSAxXSAqIHAgJSBNT0Q7IAp9CgpzdHJ1Y3QgTm9kZSB7CglpbnQgbGVuID0gMDsgCglpbnQgaCA9IDAsIGhfcmV2ID0gMDsgCgoJTm9kZSgpIHt9CgoJTm9kZShjaGFyIGMpIHsKCQlsZW4gPSAxOyAgCgkJaCA9IGhfcmV2ID0gKGMgLSAnYScgKyAxKTsgCgl9CgoJTm9kZSBvcGVyYXRvcisoY29uc3QgTm9kZSYgb3RoZXIpIGNvbnN0IHsKCQlOb2RlIGFuczsgCgkJYW5zLmxlbiA9IGxlbiArIG90aGVyLmxlbjsgIAoJCWFucy5oID0gKDFsbCAqIGggKiBwX3Bvd1tvdGhlci5sZW5dICsgb3RoZXIuaCkgJSBNT0Q7ICAgCgkJYW5zLmhfcmV2ID0gKDFsbCAqIG90aGVyLmhfcmV2ICogcF9wb3dbbGVuXSArIGhfcmV2KSAlIE1PRDsgCgkJcmV0dXJuIGFuczsgCgl9Cn07IAoKTm9kZSBzZWdbNCAqIE5dOyAgCgp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKSB7CglpZiAobCA9PSByKSB7CgkJc2VnW2lkXSA9IE5vZGUoc1tsXSk7ICAKCQlyZXR1cm47IAoJfQoJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCglidWlsZChpZCAqIDIsIGwsIG1pZCk7IAoJYnVpbGQoaWQgKiAyICsgMSwgbWlkICsgMSwgcik7IAoJc2VnW2lkXSA9IHNlZ1tpZCAqIDJdICsgc2VnW2lkICogMiArIDFdOyAKfQoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGNoYXIgYykgewoJaWYgKGwgPiBwb3MgfHwgciA8IHBvcykgcmV0dXJuOyAKCglpZiAobCA9PSByKSB7CgkJc2VnW2lkXSA9IE5vZGUoYyk7IAoJCXJldHVybjsgCgl9CgoJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgl1cGRhdGUoaWQgKiAyLCBsLCBtaWQsIHBvcywgYyk7IAoJdXBkYXRlKGlkICogMiArIDEsIG1pZCArIDEsIHIsIHBvcywgYyk7IAoKCXNlZ1tpZF0gPSBzZWdbaWQgKiAyXSArIHNlZ1tpZCAqIDIgKyAxXTsgCn0KCk5vZGUgZ2V0KGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpIHsKCWlmIChsID4gdiB8fCByIDwgdSkgcmV0dXJuIE5vZGUoKTsgIAoKCWlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc2VnW2lkXTsgCgoJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCglyZXR1cm4gZ2V0KGlkICogMiwgbCwgbWlkLCB1LCB2KSArIGdldChpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IHE7IAkKCWNpbiA+PiBzOyAKCXMgPSAnICcgKyBzOyAgCgoJcHJlY29tcHV0ZSgpOyAgCgkKCWJ1aWxkKDEsIDEsIG4pOyAgCgoJd2hpbGUgKHEtLSkgewoJCWludCB0eXBlOyBjaW4gPj4gdHlwZTsgCgoJCWlmICh0eXBlID09IDEpIHsKCQkJaW50IHBvczsgY2hhciBjOyAgCgkJCWNpbiA+PiBwb3MgPj4gYzsgCgkJCXVwZGF0ZSgxLCAxLCBuLCBwb3MsIGMpOyAKCQl9CgkJZWxzZSB7CgkJCWludCBsLCByOyAKCQkJY2luID4+IGwgPj4gcjsgCgkJCU5vZGUgY3VyID0gZ2V0KDEsIDEsIG4sIGwsIHIpOyAKCQkJY291dCA8PCAoY3VyLmggPT0gY3VyLmhfcmV2ID8gIllFUyIgOiAiTk8iKSA8PCAnXG4nOyAKCQl9Cgl9Cn0=