#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, m, k;
const long long p = 13331;
const long long mod = 1e9 + 7;
long long pow1[maxn];
long long pow1_sum[maxn];
struct xx {
  long long hash1;
  int flag;
} T[maxn * 4];
void pushup(int l, int r, int i) {
  int mid = (l + r) >> 1;
  T[i].hash1 =
      ((T[(i << 1)].hash1 * pow1[r - mid]) % mod + T[(i << 1) | 1].hash1) % mod;
}
void pushdown(int l, int r, int i) {
  if (T[i].flag == -1) return;
  int mid = (l + r) >> 1;
  T[(i << 1)].hash1 = (T[i].flag * pow1_sum[mid - l]) % mod;
  T[(i << 1) | 1].hash1 = (T[i].flag * pow1_sum[r - mid - 1]) % mod;
  T[(i << 1)].flag = T[(i << 1) | 1].flag = T[i].flag;
  T[i].flag = -1;
}
void build(int l, int r, int i) {
  T[i].flag = -1;
  if (l == r) {
    char ch;
    scanf(" %c", &ch);
    T[i].hash1 = ch - '0';
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, (i << 1));
  build(mid + 1, r, (i << 1) | 1);
  pushup(l, r, i);
}
void update(int l, int r, int ql, int qr, int i, int ch) {
  if (ql <= l && r <= qr) {
    T[i].hash1 = (ch * pow1_sum[r - l]) % mod;
    T[i].flag = ch;
    return;
  }
  pushdown(l, r, i);
  int mid = (l + r) >> 1;
  if (ql <= mid) update(l, mid, ql, qr, (i << 1), ch);
  if (qr > mid) update(mid + 1, r, ql, qr, (i << 1) | 1, ch);
  pushup(l, r, i);
}
long long query(int l, int r, int ql, int qr, int i) {
  if (ql <= l && r <= qr) return T[i].hash1;
  pushdown(l, r, i);
  int mid = (l + r) >> 1;
  long long a1 = 0, a2 = 0;
  if (ql <= mid) a1 = query(l, mid, ql, qr, (i << 1));
  if (qr > mid) a2 = query(mid + 1, r, ql, qr, (i << 1) | 1);
  return ((a1 * pow1[max(0, min(r, qr) - mid)]) % mod + a2) % mod;
}
int main() {
  pow1[0] = 1;
  pow1_sum[0] = 1;
  for (int i = 1; i < maxn; ++i) {
    pow1[i] = (pow1[i - 1] * p) % mod;
    pow1_sum[i] = (pow1_sum[i - 1] + pow1[i]) % mod;
  }
  while (~scanf("%d%d%d", &n, &m, &k)) {
    build(1, n, 1);
    for (int i = 1; i <= m + k; ++i) {
      int op, x, y, z;
      scanf("%d%d%d%d", &op, &x, &y, &z);
      if (op == 1) {
        update(1, n, x, y, 1, z);
      } else {
        if (z == y - x + 1) {
          printf("YES\n");
          continue;
        }
        long long tx = query(1, n, x, y - z, 1);
        long long ty = query(1, n, x + z, y, 1);
        if (tx == ty)
          printf("YES\n");
        else
          printf("NO\n");
      }
    }
  }
  return 0;
}
