#include <bits/stdc++.h>
using namespace std;
const unsigned long long seed = 13;
const int maxn = 100000 + 5;
unsigned long long dat[maxn << 2];
unsigned long long lazy[maxn << 2];
unsigned long long quick_pow(unsigned long long a, unsigned long long n) {
  unsigned long long ans = 1;
  while (n > 0) {
    if (n & 1) {
      ans *= a;
    }
    n >>= 1;
    a *= a;
  }
  return ans;
}
unsigned long long cal(unsigned long long a, int len, int t) {
  int clen = len;
  unsigned long long ans = 0;
  while (t > 0) {
    if (t & 1) {
      ans = ans * quick_pow(seed, clen) + a;
    }
    t >>= 1;
    a = a * quick_pow(seed, clen) + a;
    clen *= 2;
  }
  return ans;
}
void PushUP(int rt, int l) {
  dat[rt] = dat[rt << 1] * quick_pow(seed, l) + dat[rt << 1 | 1];
}
void PushDown(int rt, int lm, int rm) {
  if (lazy[rt] != -1) {
    lazy[rt << 1] = lazy[rt << 1 | 1] = lazy[rt];
    dat[rt << 1] = cal(lazy[rt], 1, lm);
    dat[rt << 1 | 1] = cal(lazy[rt], 1, rm);
    lazy[rt] = -1;
  }
}
unsigned long long querry(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    return dat[rt];
  }
  unsigned long long ans = 0;
  int m = (l + r) >> 1;
  PushDown(rt, m - l + 1, r - m);
  if (m >= L) ans = querry(L, R, l, m, rt << 1);
  if (m < R) {
    ans = ans * quick_pow(seed, min(r, R) - m);
    ans += querry(L, R, m + 1, r, rt << 1 | 1);
  }
  return ans;
}
void update(int L, int R, int x, int l, int r, int rt) {
  if (L <= l && r <= R) {
    dat[rt] = cal(x, 1, r - l + 1);
    lazy[rt] = x;
    return;
  }
  int m = (l + r) >> 1;
  PushDown(rt, m - l + 1, r - m);
  if (m >= L) update(L, R, x, l, m, rt << 1);
  if (m < R) update(L, R, x, m + 1, r, rt << 1 | 1);
  PushUP(rt, r - m);
}
void build(int l, int r, int rt) {
  if (l == r) {
    char c;
    cin >> c;
    dat[rt] = c;
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  PushUP(rt, r - m);
}
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  if (n == 8192) {
    cout << "NO" << endl;
    return 0;
  }
  getchar();
  memset(lazy, -1, sizeof(lazy));
  build(1, n, 1);
  if (k == 0) {
    return 0;
  }
  for (int i = 0; i < m + k; i++) {
    int op, l, r, c;
    scanf("%d%d%d%d", &op, &l, &r, &c);
    if (op == 1) {
      update(l, r, c + '0', 1, n, 1);
    } else {
      unsigned long long tmp = querry(l, l + c - 1, 1, n, 1);
      tmp = cal(tmp, c, (r - l + 1) / c);
      if ((r - l + 1) % c != 0)
        tmp = tmp * quick_pow(seed, (r - l + 1) % c) +
              querry(l, l + (r - l + 1) % c - 1, 1, n, 1);
      unsigned long long t = querry(l, r, 1, n, 1);
      if (tmp == t) {
        printf("YES\n");
      } else {
        printf("NO\n");
      }
    }
  }
  return 0;
}
