#include <bits/stdc++.h>
using namespace std;
inline int max(int a, int b) { return a < b ? b : a; }
inline int min(int a, int b) { return a > b ? b : a; }
inline long long max(long long a, long long b) { return a < b ? b : a; }
inline long long min(long long a, long long b) { return a > b ? b : a; }
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const long long INF = 1e18;
const long long base = 127;
int hs[] = {2, 5, 7, 11, 13, 17, 19, 23, 29, 31};
long long power(long long x, long long y) {
  long long t = 1;
  x = x % mod;
  while (y > 0) {
    if (y & 1)
      y ^= 1, t = t * x % mod;
    else
      y >>= 1, x = x * x % mod;
  }
  return t;
}
long long tree[6 * N], lazy[6 * N], in9;
long long bp[N], inv[N];
long long arr[N];
void make_tree(int C, int S, int E) {
  if (S == E) {
    tree[C] = arr[S];
    return;
  }
  int m = (S + E) / 2;
  make_tree(C * 2, S, m);
  make_tree(C * 2 + 1, m + 1, E);
  tree[C] = (tree[C * 2] + bp[m - S + 1] * tree[C * 2 + 1] % mod) % mod;
}
void upd(int C, int S, int E, int s, int e, int v) {
  if (s <= S && E <= e) lazy[C] = v;
  if (lazy[C] != 0) {
    tree[C] = (lazy[C] * (((bp[E - S + 1] + mod - 1) * in9) % mod)) % mod;
    lazy[C * 2] = lazy[C * 2 + 1] = lazy[C];
    lazy[C] = 0;
  }
  if (s <= S && E <= e) return;
  if (s > E || e < S) return;
  int m = (S + E) / 2;
  upd(C * 2, S, m, s, e, v);
  upd(C * 2 + 1, m + 1, E, s, e, v);
  tree[C] = (tree[C * 2] + bp[m - S + 1] * tree[C * 2 + 1] % mod) % mod;
}
long long q(int C, int S, int E, int s, int e) {
  if (lazy[C] != 0) {
    tree[C] = (lazy[C] * (((bp[E - S + 1] + mod - 1) * in9) % mod)) % mod;
    lazy[C * 2] = lazy[C * 2 + 1] = lazy[C];
    lazy[C] = 0;
  }
  if (s > E || e < S) return 0;
  if (s <= S && E <= e) return (tree[C] * bp[max(0, S - s)]) % mod;
  ;
  int m = (S + E) / 2;
  long long p = q(C * 2, S, m, s, e), qu = q(C * 2 + 1, m + 1, E, s, e);
  return (p + qu) % mod;
}
char s[N];
int main() {
  int n, m, k;
  bp[0] = 1;
  inv[0] = 1;
  in9 = power(base - 1, mod - 2);
  for (int i = 1; i < N; ++i) {
    bp[i] = bp[i - 1] * base % mod;
    inv[i] = power(bp[i], mod - 2);
  }
  scanf("%d %d %d", &n, &m, &k);
  scanf("%s", s);
  for (int i = 0; i < n; ++i) {
    arr[i] = hs[s[i] - '0'];
  }
  make_tree(1, 0, n - 1);
  m += k;
  while (m--) {
    int x;
    scanf("%d", &x);
    int l, r, d;
    scanf("%d %d %d", &l, &r, &d);
    if (x == 1) {
      upd(1, 0, n - 1, l - 1, r - 1, hs[d]);
    } else {
      l--, r--;
      int rr = r;
      int x = (r - l + 1) / d;
      r = l + x * d - 1;
      long long p = ((bp[r - l + 1] - 1 + mod) % mod) *
                    power(power(base, d) - 1 + mod, mod - 2) % mod,
                y = q(1, 0, n - 1, l, l + d - 1), z = q(1, 0, n - 1, l, r);
      if ((p * y) % mod == z) {
        if (rr == r)
          printf("YES\n");
        else {
          int c = (rr - r);
          if (q(1, 0, n - 1, l, l + c - 1) == q(1, 0, n - 1, r + 1, rr)) {
            printf("YES\n");
          } else
            printf("NO\n");
        }
      } else
        printf("NO\n");
    }
  }
  return 0;
}
