#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int inf = 0x3f3f3f3f;
const int finf = -0x3f3f3f3f - 1;
const int maxn = 1e5 + 5;
const int P = 20171321;
int n;
int m, k, q;
string s;
struct SegmentTree {
  unsigned long long hsh[maxn * 4];
  int len[maxn * 4], lazy[maxn * 4];
  int mod;
  unsigned long long p[maxn], sp[maxn];
  void init_p() {
    p[0] = 1;
    for (int i = 1; i <= n; i++) p[i] = p[i - 1] * P % mod;
    sp[0] = 1;
    for (int i = 1; i <= n; i++) sp[i] = (sp[i - 1] + p[i]) % mod;
  }
  void set_mod(int x) { mod = x; }
  unsigned long long cover(int c, int k) { return sp[k - 1] * c % mod; }
  void pushup(int x) {
    hsh[x] = (hsh[x << 1] * p[len[x << 1 | 1]] % mod + hsh[x << 1 | 1]) % mod;
  }
  void getdown(int x, int c) {
    if (c == -1) return;
    hsh[x] = cover(c, len[x]);
    lazy[x] = c;
  }
  void pushdown(int x) {
    getdown(x << 1, lazy[x]);
    getdown(x << 1 | 1, lazy[x]);
    lazy[x] = -1;
  }
  void build(string &s, int l = 1, int r = n, int x = 1) {
    len[x] = r - l + 1;
    lazy[x] = -1;
    if (l == r) {
      hsh[x] = s[l - 1] - '0';
      return;
    }
    int mid = (l + r) >> 1;
    build(s, l, mid, x << 1);
    build(s, mid + 1, r, x << 1 | 1);
    pushup(x);
  }
  void modify(int ql, int qr, int c, int l = 1, int r = n, int x = 1) {
    if (ql <= l && r <= qr) {
      getdown(x, c);
      return;
    }
    pushdown(x);
    int mid = (l + r) >> 1;
    if (ql <= mid) modify(ql, qr, c, l, mid, x << 1);
    if (qr > mid) modify(ql, qr, c, mid + 1, r, x << 1 | 1);
    pushup(x);
  }
  unsigned long long query(int ql, int qr, int l = 1, int r = n, int x = 1) {
    if (ql <= l && r <= qr) return hsh[x];
    pushdown(x);
    int mid = (l + r) >> 1;
    unsigned long long ans = 0;
    if (ql <= mid) ans = query(ql, qr, l, mid, x << 1);
    if (qr > mid)
      ans = (ans * p[min(qr, r) - max(ql, mid + 1) + 1] % mod +
             query(ql, qr, mid + 1, r, x << 1 | 1)) %
            mod;
    return ans;
  }
} hsh1, hsh2;
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> k >> s;
  q = m + k;
  hsh1.set_mod(1e9 + 13);
  hsh2.set_mod(1e9 + 21);
  hsh1.init_p();
  hsh2.init_p();
  hsh1.build(s);
  hsh2.build(s);
  while (q--) {
    int op, l, r, c;
    cin >> op >> l >> r >> c;
    if (op == 2) {
      if (r - l + 1 == c)
        cout << "YES" << endl;
      else
        cout << ((hsh1.query(l, r - c) == hsh1.query(l + c, r) &&
                  hsh2.query(l, r - c) == hsh2.query(l + c, r))
                     ? "YES"
                     : "NO")
             << endl;
    } else
      hsh1.modify(l, r, c), hsh2.modify(l, r, c);
  }
  return 0;
}
