#include <bits/stdc++.h>
using namespace std;
const int mod = 20020302;
const int base = 31;
const int maxn = 1e5 + 10;
int n, m, K;
unsigned long long P[maxn];
unsigned long long h[15][maxn];
char s[maxn];
struct seg {
  unsigned long long sum;
  int col;
} tree[maxn << 2];
void pre() {
  P[0] = 1;
  for (int i = 1; i <= n; i++) P[i] = P[i - 1] * base % mod;
  for (int i = 0; i < 10; i++)
    for (int j = 1; j <= n; j++) h[i][j] = (h[i][j - 1] * base % mod + i) % mod;
}
void up(int p, int l, int r) {
  int mid = (l + r) >> 1;
  (tree[p].sum) = (((tree[(p << 1)].sum) * P[r - mid]) % mod +
                   (tree[(p << 1 | 1)].sum) % mod) %
                  mod;
}
void down(int p, int l, int r) {
  if ((tree[p].col) == -1) return;
  int mid = (l + r) >> 1;
  (tree[(p << 1)].sum) = h[(tree[p].col)][mid - l + 1] % mod,
              (tree[(p << 1 | 1)].sum) = h[(tree[p].col)][r - mid] % mod;
  (tree[(p << 1)].col) = (tree[(p << 1 | 1)].col) = (tree[p].col),
              (tree[p].col) = -1;
}
void build(int p, int l, int r) {
  (tree[p].col) = -1;
  if (l == r) {
    (tree[p].sum) = s[l] - '0' % mod;
    return;
  }
  int mid = (l + r) >> 1;
  build((p << 1), l, mid);
  build((p << 1 | 1), mid + 1, r);
  up(p, l, r);
}
void change(int p, int L, int R, int l, int r, int k) {
  if (L >= l && R <= r) {
    (tree[p].sum) = h[k][R - L + 1];
    (tree[p].col) = k;
    return;
  }
  down(p, L, R);
  int mid = (L + R) >> 1;
  if (l > mid)
    change((p << 1 | 1), mid + 1, R, l, r, k);
  else if (r <= mid)
    change((p << 1), L, mid, l, r, k);
  else
    change((p << 1), L, mid, l, r, k),
        change((p << 1 | 1), mid + 1, R, l, r, k);
  up(p, L, R);
}
unsigned long long query(int p, int L, int R, int l, int r) {
  if (L >= l && R <= r) return (tree[p].sum);
  down(p, L, R);
  int mid = (L + R) >> 1;
  if (l > mid)
    return query((p << 1 | 1), mid + 1, R, l, r);
  else if (r <= mid)
    return query((p << 1), L, mid, l, r);
  else
    return (((query((p << 1), L, mid, l, mid) % mod) * P[r - mid]) % mod +
            query((p << 1 | 1), mid + 1, R, mid + 1, r) % mod) %
           mod;
}
int main() {
  scanf("%d%d%d", &n, &m, &K);
  m += K;
  scanf("%s", s + 1);
  pre();
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int op, l, r, k;
    scanf("%d%d%d%d", &op, &l, &r, &k);
    if (op == 1)
      change(1, 1, n, l, r, k);
    else {
      if (r - l + 1 == k) {
        puts("YES");
        continue;
      }
      puts(query(1, 1, n, l, r - k) == query(1, 1, n, l + k, r) ? "YES" : "NO");
    }
  }
  return 0;
}
