#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int n, m, k;
char s[N];
struct Seg {
  unsigned long long tree[N * 4], bit[N], sum[N], seed, MOD;
  int lazy[N * 4];
  inline void init() {
    for (int i = bit[0] = sum[0] = 1; i < N; i++) {
      bit[i] = (bit[i - 1] * seed) % MOD;
      sum[i] = (sum[i - 1] + bit[i]) % MOD;
    }
    build(1, 1, n);
  }
  inline void pushup(int p, int llen, int rlen) {
    tree[p] = (tree[p << 1] * bit[rlen] % MOD + tree[p << 1 | 1]) % MOD;
  }
  inline void tag(int p, int dig, int len) {
    lazy[p] = dig;
    tree[p] = sum[len - 1] * dig % MOD;
  }
  inline void pushdown(int p, int llen, int rlen) {
    if (lazy[p] >= 0) {
      tag(p << 1, lazy[p], llen);
      tag(p << 1 | 1, lazy[p], rlen);
      lazy[p] = -1;
    }
  }
  void build(int p, int l, int r) {
    lazy[p] = -1;
    if (l == r) {
      tree[p] = s[l] - '0';
      return;
    }
    int mid = l + r >> 1;
    build(p << 1, l, mid);
    build(p << 1 | 1, mid + 1, r);
    pushup(p, mid - l + 1, r - mid);
  }
  void update(int p, int l, int r, int x, int y, int dig) {
    if (x <= l && y >= r) {
      lazy[p] = dig;
      tree[p] = dig * sum[r - l] % MOD;
      return;
    }
    int mid = l + r >> 1;
    pushdown(p, mid - l + 1, r - mid);
    if (x <= mid) update(p << 1, l, mid, x, y, dig);
    if (y > mid) update(p << 1 | 1, mid + 1, r, x, y, dig);
    pushup(p, mid - l + 1, r - mid);
  }
  unsigned long long query(int p, int l, int r, int x, int y) {
    if (x > y) return 0;
    if (x <= l && y >= r) return tree[p];
    int mid = l + r >> 1;
    pushdown(p, mid - l + 1, r - mid);
    if (y <= mid) return query(p << 1, l, mid, x, y);
    if (x > mid) return query(p << 1 | 1, mid + 1, r, x, y);
    return (query(p << 1, l, mid, x, y) * bit[min(y, r) - (mid + 1) + 1] % MOD +
            query(p << 1 | 1, mid + 1, r, x, y)) %
           MOD;
  }
} seg[2];
int main() {
  scanf("%d%d%d", &n, &m, &k);
  m += k;
  scanf("%s", s + 1);
  seg[0].seed = 27;
  seg[0].MOD = 1e9 + 7;
  seg[1].seed = 233;
  seg[1].MOD = 1e9 + 9;
  seg[0].init();
  seg[1].init();
  for (int opt, l, r, d; m--;) {
    scanf("%d%d%d%d", &opt, &l, &r, &d);
    if (opt == 1) {
      for (int i = 0; i < 2; i++) seg[i].update(1, 1, n, l, r, d);
    } else {
      if (r - l + 1 == d ||
          (seg[0].query(1, 1, n, l, r - d) == seg[0].query(1, 1, n, l + d, r) &&
           seg[1].query(1, 1, n, l, r - d) ==
               seg[1].query(1, 1, n, l + d, r))) {
        puts("YES");
      } else {
        puts("NO");
      }
    }
  }
  return 0;
}
