#include <bits/stdc++.h>
using namespace std;
const int base = 31, mod = 19260817;
char s[100010];
int n, m, K, po[100010] = {1}, val[10][100010];
struct inf {
  int l, r, tg;
  long long val;
} tr[100010 << 2];
void pre() {
  for (int i = 1; i < 100010; i++) po[i] = po[i - 1] * base % mod;
  for (int i = 0; i < 10; i++) {
    for (int j = 1; j < 100010; j++)
      val[i][j] = (val[i][j - 1] * base % mod + i) % mod;
  }
}
void update(int rt) {
  tr[rt].val =
      (tr[rt << 1].val * po[tr[rt << 1 | 1].r - tr[rt << 1 | 1].l + 1] % mod +
       tr[rt << 1 | 1].val) %
      mod;
}
void build(int rt, int l, int r) {
  tr[rt].l = l, tr[rt].r = r;
  tr[rt].tg = -1;
  if (l == r) {
    tr[rt].val = s[l] - '0';
    return;
  }
  int mid = (l + r) >> 1;
  build(rt << 1, l, mid);
  build(rt << 1 | 1, mid + 1, r);
  update(rt);
}
void pushdown(int rt) {
  if (tr[rt].tg == -1) return;
  int k = tr[rt].tg;
  tr[rt << 1].val = val[k][tr[rt << 1].r - tr[rt << 1].l + 1];
  tr[rt << 1 | 1].val = val[k][tr[rt << 1 | 1].r - tr[rt << 1 | 1].l + 1];
  tr[rt << 1].tg = tr[rt << 1 | 1].tg = k;
  tr[rt].tg = -1;
}
void change(int rt, int l, int r, int k) {
  if (tr[rt].l == l && tr[rt].r == r) {
    tr[rt].tg = k;
    tr[rt].val = val[k][tr[rt].r - tr[rt].l + 1];
    return;
  }
  pushdown(rt);
  int mid = (tr[rt].l + tr[rt].r) >> 1;
  if (r <= mid)
    change(rt << 1, l, r, k);
  else if (l > mid)
    change(rt << 1 | 1, l, r, k);
  else
    change(rt << 1, l, mid, k), change(rt << 1 | 1, mid + 1, r, k);
  update(rt);
}
long long query(int rt, int l, int r) {
  if (tr[rt].l == l and tr[rt].r == r) return tr[rt].val;
  pushdown(rt);
  int mid = (tr[rt].l + tr[rt].r) >> 1;
  if (r <= mid)
    return query(rt << 1, l, r);
  else if (l > mid)
    return query(rt << 1 | 1, l, r);
  else
    return ((query(rt << 1, l, mid) % mod) * po[r - mid] % mod +
            query(rt << 1 | 1, mid + 1, r) % mod) %
           mod;
}
int main() {
  pre();
  scanf("%d%d%d", &n, &m, &K);
  int tt = m + K;
  scanf("%s", s + 1);
  build(1, 1, n);
  for (int opt, l, r, k; tt; tt--) {
    scanf("%d%d%d%d", &opt, &l, &r, &k);
    switch (opt) {
      case 1:
        change(1, l, r, k);
        break;
      case 2: {
        if (r - l + 1 == k) {
          puts("YES");
          continue;
        }
        puts(query(1, l, r - k) == query(1, l + k, r) ? "YES" : "NO");
        break;
      }
    }
  }
}
