import java.util.Scanner;
public class Main {
static final int N = 200010, p = 131, mod = (int) 1e9 + 7;
static long[] exp = new long[N];
static char[] str = new char[N];
static Node[] tree = new Node[N << 2];
static int n, q;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
String s = sc.next();
exp[0] = 1;
for (int i = 1; i <= n; i++) {
exp[i] = exp[i - 1] * p % mod;
str[i] = s.charAt(i - 1);
}
build(1, 1, n);
q = sc.nextInt();
for (int i = 1; i <= q; i++) {
int op = sc.nextInt();
if (op == 1) {
int x = sc.nextInt();
char c = sc.next().charAt(0);
update(1, 1, n, x, c);
} else {
int l1 = sc.nextInt(), r1 = sc.nextInt();
int l2 = sc.nextInt(), r2 = sc.nextInt();
if (check(l1, r1, l2, r2)) System.out.println("YES");
else System.out.println("NO");
}
}
}
static boolean check(int l1, int r1, int l2, int r2) {
return query(1, 1, n, l1, r1).equals(query(1, 1, n, l2, r2));
}
static Node query(int u, int l, int r, int L, int R) {
if (L <= l && r <= R) return tree[u];
int mid = l + r >> 1;
if (R <= mid) return query(u << 1, l, mid, L, R);
if (L > mid) return query(u << 1 | 1, mid + 1, r, L, R);
return query(u << 1, l, mid, L, R).add(query(u << 1 | 1, mid + 1, r, L, R));
}
static void update(int u, int l, int r, int x, char c) {
if (l == r) {
tree[u].h = c - 'a' + 1;
return;
}
int mid = l + r >> 1;
if (x <= mid) update(u << 1, l, mid, x, c);
else update(u << 1 | 1, mid + 1, r, x, c);
pushup(u);
}
static void build(int u, int l, int r) {
tree[u] = new Node();
if (l == r) {
tree[u].h = str[l] - 'a' + 1;
tree[u].len = 1;
return;
}
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
static void pushup(int u) {
tree[u] = tree[u << 1].add(tree[u << 1 | 1]);
}
static class Node {
long h;
int len;
Node add(Node o) {
Node res = new Node();
res.h = (this.h * exp[o.len] % mod + o.h) % mod;
res.len = this.len + o.len;
return res;
}
public boolean equals(Node o) {
return this.h == o.h && this.len == o.len;
}
}
}