#include <bits/stdc++.h>
const int maxn = 100010;
const int PRIME = 103;
const int mo = 1000000007;
const int maxtreetop = 270000;
struct Ttree {
  int start, stop;
  long long sum;
  int cover;
} tree[maxtreetop + 1];
char s[maxn + 1];
int a[maxn + 1];
long long yh[maxn + 1];
long long sum[maxn + 1];
int n, tot;
long long result;
void init() {
  int i, j;
  scanf("%d", &n);
  scanf("%d%d", &i, &j);
  tot = i + j;
  scanf("%s", s);
  for (i = 1; i <= n; ++i) a[i] = s[i - 1] - '0';
  yh[0] = 1;
  sum[0] = 1;
  for (i = 1; i <= n; ++i) {
    yh[i] = (yh[i - 1] * PRIME) % mo;
    sum[i] = (sum[i - 1] + yh[i]) % mo;
  }
}
void init_tree(int p, int start, int stop) {
  int mid;
  tree[p].start = start;
  tree[p].stop = stop;
  tree[p].cover = -1;
  if (start == stop) {
    tree[p].sum = a[start];
    return;
  }
  mid = (start + stop) / 2;
  init_tree(p * 2, start, mid);
  init_tree(p * 2 + 1, mid + 1, stop);
  tree[p].sum =
      (tree[p * 2].sum + yh[mid + 1 - tree[p].start] * tree[p * 2 + 1].sum) %
      mo;
}
void set(int p, int c) {
  tree[p].cover = c;
  tree[p].sum = sum[tree[p].stop - tree[p].start];
  tree[p].sum *= c;
  tree[p].sum %= mo;
}
void down(int p) {
  if (tree[p].cover == -1) return;
  set(p * 2, tree[p].cover);
  set(p * 2 + 1, tree[p].cover);
  tree[p].cover = -1;
}
void change_tree(int p, int start, int stop, int c) {
  int mid;
  if ((start <= tree[p].start) && (stop >= tree[p].stop)) {
    set(p, c);
    return;
  }
  down(p);
  mid = (tree[p].start + tree[p].stop) / 2;
  if (start <= mid) change_tree(p * 2, start, stop, c);
  if (stop > mid) change_tree(p * 2 + 1, start, stop, c);
  tree[p].sum =
      (tree[p * 2].sum + yh[mid + 1 - tree[p].start] * tree[p * 2 + 1].sum) %
      mo;
}
void wen_tree(int p, int start, int stop) {
  int mid;
  if ((start <= tree[p].start) && (stop >= tree[p].stop)) {
    result = (result + yh[tree[p].start - start] * tree[p].sum) % mo;
    return;
  }
  down(p);
  mid = (tree[p].start + tree[p].stop) / 2;
  if (start <= mid) wen_tree(p * 2, start, stop);
  if (stop > mid) wen_tree(p * 2 + 1, start, stop);
  tree[p].sum =
      (tree[p * 2].sum + yh[mid + 1 - tree[p].start] * tree[p * 2 + 1].sum) %
      mo;
}
void work() {
  int w, k, x, y, c;
  long long r1;
  init_tree(1, 1, n);
  for (w = 1; w <= tot; ++w) {
    scanf("%d%d%d%d", &k, &x, &y, &c);
    if (k == 1) {
      change_tree(1, x, y, c);
    } else {
      if (c == y - x + 1) {
        printf("YES\n");
        continue;
      }
      result = 0;
      wen_tree(1, x, y - c);
      r1 = result;
      result = 0;
      wen_tree(1, x + c, y);
      if (result == r1)
        printf("YES\n");
      else
        printf("NO\n");
    }
  }
}
int main() {
  init();
  work();
  return 0;
}
