#include <bits/stdc++.h>
using namespace std;
long long pw[100000];
long long cummulativePw[100000];
long long seg[400000];
long long toPush[400000];
string str;
void build(int ind, int l, int r) {
  if (l == r) {
    seg[ind] = str[l] - '0';
    return;
  }
  int m = (l + r) / 2;
  build(ind * 2 + 1, l, m);
  build(ind * 2 + 2, m + 1, r);
  seg[ind] = (pw[r - m] * seg[ind * 2 + 1] + seg[ind * 2 + 2]) % 1000000007LL;
  return;
}
void update(int ind, int s, int e, int l, int r, long long c) {
  if (s > r || e < l) return;
  if (l <= s && e <= r) {
    toPush[ind] = c + 1;
    seg[ind] = c * cummulativePw[e - s] % 1000000007LL;
    return;
  }
  int m = (s + e) / 2;
  if (toPush[ind] > 0) {
    toPush[ind * 2 + 1] = toPush[ind * 2 + 2] = toPush[ind];
    toPush[ind] = 0;
    seg[ind * 2 + 1] =
        (toPush[ind * 2 + 1] - 1) * cummulativePw[m - s] % 1000000007LL;
    seg[ind * 2 + 2] =
        (toPush[ind * 2 + 2] - 1) * cummulativePw[e - m - 1] % 1000000007LL;
  }
  update(ind * 2 + 1, s, m, l, r, c);
  update(ind * 2 + 2, m + 1, e, l, r, c);
  seg[ind] = (pw[e - m] * seg[ind * 2 + 1] + seg[ind * 2 + 2]) % 1000000007LL;
  return;
}
long long query(int ind, int s, int e, int l, int r) {
  if (s > r || e < l) return 0;
  if (l <= s && e <= r) {
    return seg[ind];
  }
  int m = (s + e) / 2;
  if (toPush[ind] > 0) {
    toPush[ind * 2 + 1] = toPush[ind * 2 + 2] = toPush[ind];
    toPush[ind] = 0;
    seg[ind * 2 + 1] =
        (toPush[ind * 2 + 1] - 1) * cummulativePw[m - s] % 1000000007LL;
    seg[ind * 2 + 2] =
        (toPush[ind * 2 + 2] - 1) * cummulativePw[e - m - 1] % 1000000007LL;
  }
  return (query(ind * 2 + 1, s, m, l, r) * pw[e - m] +
          query(ind * 2 + 2, m + 1, e, l, r)) %
         1000000007LL;
}
int main() {
  int n, m, i, type, l, r, d;
  cin >> n >> m >> i;
  m += i;
  pw[0] = cummulativePw[0] = 1;
  for (i = 1; i < n; i++) {
    pw[i] = pw[i - 1] * 256LL % 1000000007LL;
    cummulativePw[i] = (cummulativePw[i - 1] + pw[i]) % 1000000007LL;
  }
  cin >> str;
  build(0, 0, n - 1);
  for (i = 0; i < m; i++) {
    cin >> type >> l >> r >> d;
    l--, r--;
    if (type == 1) {
      update(0, 0, n - 1, l, r, d);
    } else {
      bool f = query(0, 0, n - 1, l, r - d) ==
               query(0, 0, n - 1, l + d, r) * pw[d] % 1000000007LL;
      cout << (f ? "YES" : "NO") << endl;
    }
  }
  return 0;
}
