#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const long long mod1 = 1e9 + 7;
const long long mod2 = 1e9 + 9;
int a[maxn];
long long p[maxn][2];
int p2[10][maxn][2];
typedef struct SegTree {
  long long t[maxn * 3][2];
  int lazy[maxn * 3];
  void pushUp(int l, int r, int x) {
    int m = (l + r) >> 1;
    t[x][0] = ((t[x << 1][0] * p[r - m][0]) % mod1 + t[x << 1 | 1][0]) % mod1;
    t[x][1] = ((t[x << 1][1] * p[r - m][1]) % mod2 + t[x << 1 | 1][1]) % mod2;
  }
  void build(int l, int r, int x) {
    lazy[x] = -1;
    if (l == r) {
      t[x][0] = t[x][1] = a[l];
      return;
    }
    int m = (l + r) >> 1;
    build(l, m, x << 1);
    build(m + 1, r, x << 1 | 1);
    pushUp(l, r, x);
  }
  void pushDown(int l, int r, int x) {
    int m = (l + r) >> 1;
    lazy[x << 1] = lazy[x << 1 | 1] = lazy[x];
    t[x << 1][0] = p2[lazy[x]][m - l + 1][0];
    t[x << 1][1] = p2[lazy[x]][m - l + 1][1];
    t[x << 1 | 1][0] = p2[lazy[x]][r - m][0];
    t[x << 1 | 1][1] = p2[lazy[x]][r - m][1];
    lazy[x] = -1;
  }
  void update(int L, int R, int ch, int l, int r, int x) {
    if (L == l && R == r) {
      lazy[x] = ch;
      t[x][0] = p2[ch][r - l + 1][0];
      t[x][1] = p2[ch][r - l + 1][1];
      return;
    }
    int m = (l + r) >> 1;
    if (lazy[x] != -1) pushDown(l, r, x);
    if (R <= m)
      update(L, R, ch, l, m, x << 1);
    else if (L > m)
      update(L, R, ch, m + 1, r, x << 1 | 1);
    else {
      update(L, m, ch, l, m, x << 1);
      update(m + 1, R, ch, m + 1, r, x << 1 | 1);
    }
    pushUp(l, r, x);
  }
  pair<long long, long long> get(int L, int R, int l, int r, int x) {
    if (L == l && R == r) return pair<long long, long long>(t[x][0], t[x][1]);
    int m = (l + r) >> 1;
    if (lazy[x] != -1) pushDown(l, r, x);
    if (R <= m) return get(L, R, l, m, x << 1);
    if (L > m) return get(L, R, m + 1, r, x << 1 | 1);
    pair<long long, long long> a1 = get(L, m, l, m, x << 1),
                               a2 = get(m + 1, R, m + 1, r, x << 1 | 1);
    return pair<long long, long long>(
        (a1.first * p[R - m][0] + a2.first) % mod1,
        (a1.second * p[R - m][1] + a2.second) % mod2);
  }
} SegTree;
SegTree T;
int n, m, k;
int main() {
  p[0][0] = p[0][1] = 1;
  cin >> n >> m >> k;
  for (int i = 1; i <= n; i++) scanf("%1d", &a[i]);
  for (int i = 1; i <= n; i++) {
    p[i][0] = (p[i - 1][0] * 10) % mod1;
    p[i][1] = (p[i - 1][1] * 10) % mod2;
  }
  for (int i = 1; i <= 9; i++)
    for (int j = 1; j <= n; j++) {
      p2[i][j][0] = (p2[i][j - 1][0] * 10ll + i) % mod1;
      p2[i][j][1] = (p2[i][j - 1][1] * 10ll + i) % mod2;
    }
  T.build(1, n, 1);
  int l, r, md, c;
  pair<long long, long long> a1, a2;
  for (int i = 0; i < m + k; i++) {
    scanf("%d%d%d%d", &md, &l, &r, &c);
    if (md == 1) {
      T.update(l, r, c, 1, n, 1);
    } else {
      if (r - l + 1 <= c) {
        printf("YES\n");
        continue;
      }
      a1 = T.get(l + c, r, 1, n, 1), a2 = T.get(l, r - c, 1, n, 1);
      if (a1 == a2)
        printf("YES\n");
      else
        printf("NO\n");
    }
  }
  return 0;
}
