#include <bits/stdc++.h>
using namespace std;
const long long base = 17LL;
const long long MOD = 998244353LL;
const int MAXN = 1e5 + 10;
struct Node {
  long long v;
  long long tagv;
  long long len;
} st[MAXN << 2];
long long a[MAXN];
inline long long fp(long long x, long long y) {
  long long ret = 1LL;
  while (y) {
    if (y & 1) ret = ret * x % MOD;
    x = x * x % MOD;
    y >>= 1;
  }
  return ret;
}
long long inv = fp(base - 1, MOD - 2);
long long basep[MAXN];
Node operator+(const Node& a, const Node& b) {
  Node ret;
  ret.len = a.len + b.len;
  ret.tagv = -1;
  ret.v = (a.v * basep[b.len] % MOD + b.v) % MOD;
  return ret;
}
void init() {
  basep[0] = 1LL;
  for (int i = 1; i < MAXN; i++) basep[i] = basep[i - 1] * base % MOD;
}
void setv(int o, long long v) {
  st[o].v = (basep[st[o].len] - 1 + MOD) % MOD * v % MOD * inv % MOD;
  st[o].tagv = v;
}
void pushup(int o) { st[o] = st[o << 1] + st[o << 1 | 1]; }
void pushdown(int o) {
  if (st[o].tagv != -1) {
    setv(o << 1, st[o].tagv);
    setv(o << 1 | 1, st[o].tagv);
    st[o].tagv = -1;
  }
}
void build(int o, int l, int r) {
  st[o].tagv = -1;
  st[o].len = r - l + 1;
  if (l == r) {
    setv(o, a[l]);
    return;
  }
  int m = l + r >> 1;
  build(o << 1, l, m);
  build(o << 1 | 1, m + 1, r);
  pushup(o);
}
void update(int o, int l, int r, int L, int R, long long v) {
  if (L <= l && r <= R) {
    setv(o, v);
    return;
  }
  pushdown(o);
  int m = l + r >> 1;
  if (L <= m) update(o << 1, l, m, L, R, v);
  if (m < R) update(o << 1 | 1, m + 1, r, L, R, v);
  pushup(o);
}
Node query(int o, int l, int r, int L, int R) {
  if (L <= l && r <= R) return st[o];
  pushdown(o);
  int m = l + r >> 1;
  if (R <= m) return query(o << 1, l, m, L, R);
  if (m < L) return query(o << 1 | 1, m + 1, r, L, R);
  return query(o << 1, l, m, L, R) + query(o << 1 | 1, m + 1, r, L, R);
}
char s[MAXN];
int main() {
  init();
  int n, m, k;
  int x, l, r, y;
  scanf("%d%d%d", &n, &m, &k);
  scanf("%s", s);
  for (int i = 1; i <= n; i++) a[i] = s[i - 1] - '0';
  build(1, 1, n);
  for (int i = 1; i <= m + k; i++) {
    scanf("%d%d%d%d", &x, &l, &r, &y);
    if (x == 1) {
      update(1, 1, n, l, r, 1LL * (y));
    } else {
      if (y == (r - l + 1)) {
        puts("YES");
        continue;
      }
      if (query(1, 1, n, l + y, r).v == query(1, 1, n, l, r - y).v)
        puts("YES");
      else
        puts("NO");
    }
  }
  return 0;
}
