#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int p = 31;
vector<long long> pr(100007);
vector<int> sumpr(100007);
int t[4 * 100000];
int tadd[4 * 100000];
int vl[4 * 100000];
int vr[4 * 100000];
int add(long long a, long long b) {
  a += b;
  if (a >= mod) a -= mod;
  return a;
}
int mull(long long a, long long b) { return (a * b) % mod; }
int mmin(long long a, long long b) { return (a - b + mod) % mod; }
int calc(long long h1, long long h2, long long len) {
  return add(mull(h1, pr[len]), h2);
}
void push(int v) {
  if (!tadd[v]) return;
  long long len = vr[v] - vl[v] + 1;
  t[v] = mull(sumpr[len - 1], tadd[v]);
  if (vl[v] != vr[v]) {
    tadd[v * 2 + 1] = tadd[v];
    tadd[v * 2 + 2] = tadd[v];
  }
  tadd[v] = 0;
}
void build(int v, int l, int r, string &s1) {
  vl[v] = l;
  vr[v] = r;
  if (l == r) {
    t[v] = s1[l] - '0' + 1;
    return;
  }
  long long mid = (l + r) / 2;
  build(v * 2 + 1, l, mid, s1);
  build(v * 2 + 2, mid + 1, r, s1);
  t[v] = calc(t[v * 2 + 1], t[v * 2 + 2], r - mid);
}
void modif(int v, int l, int r, int val) {
  push(v);
  if (vl[v] > r || vr[v] < l) return;
  if (l <= vl[v] && vr[v] <= r) {
    tadd[v] = val;
    push(v);
    return;
  }
  modif(v * 2 + 1, l, r, val);
  modif(v * 2 + 2, l, r, val);
  long long len = vr[v * 2 + 2] - vl[v * 2 + 2] + 1;
  t[v] = calc(t[v * 2 + 1], t[v * 2 + 2], len);
}
pair<long long, long long> query(long long v, long long l, long long r) {
  push(v);
  if (vl[v] > r || vr[v] < l) return {0, 0};
  if (l <= vl[v] && vr[v] <= r) return {t[v], vr[v] - vl[v] + 1};
  pair<long long, long long> ql = query(v * 2 + 1, l, r);
  pair<long long, long long> qr = query(v * 2 + 2, l, r);
  return {calc(ql.first, qr.first, qr.second), ql.second + qr.second};
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  int q = m + k;
  string s1;
  cin >> s1;
  sumpr[0] = 1;
  pr[0] = 1;
  for (int i = 1; i <= n; i++) {
    pr[i] = mull(pr[i - 1], p);
    sumpr[i] = add(sumpr[i - 1], pr[i]);
  }
  build(0, 0, n - 1, s1);
  while (q--) {
    int type, l, r, d;
    cin >> type >> l >> r >> d;
    l--;
    r--;
    if (type == 1) {
      modif(0, l, r, d + 1);
    } else {
      pair<int, int> q1 = query(0, l + d, r);
      pair<int, int> q2 = query(0, l, r - d);
      if (q1.first == q2.first) {
        cout << "YES" << endl;
      } else {
        cout << "NO" << endl;
      }
    }
  }
  return 0;
}
