#include <bits/stdc++.h>
using namespace std;
const unsigned long long MOD = 1e8 + 7;
const unsigned long long base = 71;
const unsigned long long max_n = 2e5 + 400;
unsigned long long n, m, k, q;
string s;
unsigned long long pw[2 * max_n + 200];
unsigned long long save[20][2 * max_n + 200];
unsigned long long seg[10 * max_n], lazy[10 * max_n];
void init(unsigned long long v, unsigned long long b, unsigned long long e) {
  lazy[v] = -1;
  if (b == e) {
    seg[v] = s[b];
    return;
  }
  unsigned long long mid = (b + e) / 2;
  init(v << 1, b, mid);
  init(v << 1 ^ 1, mid + 1, e);
  seg[v] = (seg[v << 1] * pw[e - mid] + seg[v << 1 ^ 1]) % MOD;
}
void shift(unsigned long long v, unsigned long long b, unsigned long long e,
           unsigned long long mid) {
  if (lazy[v] == -1) return;
  lazy[v << 1] = lazy[v << 1 ^ 1] = lazy[v];
  seg[v << 1] = save[lazy[v]][mid - b];
  seg[v << 1 ^ 1] = save[lazy[v]][e - mid - 1];
  lazy[v] = -1;
}
void update(unsigned long long v, unsigned long long b, unsigned long long e,
            unsigned long long l, unsigned long long r,
            unsigned long long val) {
  if (b > r || l > e) return;
  if (l <= b && e <= r) {
    seg[v] = save[val][e - b];
    lazy[v] = val;
    return;
  }
  unsigned long long mid = (b + e) / 2;
  shift(v, b, e, mid);
  update(v << 1, b, mid, l, r, val);
  update(v << 1 ^ 1, mid + 1, e, l, r, val);
  seg[v] = (seg[v << 1] * pw[e - mid] + seg[v << 1 ^ 1]) % MOD;
}
unsigned long long get(unsigned long long v, unsigned long long b,
                       unsigned long long e, unsigned long long l,
                       unsigned long long r) {
  if (b > r || l > e) return 0;
  if (l <= b && e <= r) return seg[v];
  unsigned long long mid = (b + e) / 2;
  shift(v, b, e, mid);
  unsigned long long first = get(v << 1, b, mid, l, r);
  unsigned long long second = get(v << 1 ^ 1, mid + 1, e, l, r);
  first = (first * pw[max(0, int(min(r, e) - mid))] + second) % MOD;
  return first;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0);
  cin >> n >> m >> k;
  q = m + k;
  cin >> s;
  pw[0] = 1;
  for (unsigned long long i = 1; i < max_n; i++)
    pw[i] = (pw[i - 1] * base) % MOD;
  for (unsigned long long i = 0; i < 10; i++) {
    save[i][0] = i + 48;
    for (unsigned long long j = 1; j < max_n; j++)
      save[i][j] = (save[i][j - 1] * base + (i + 48)) % MOD;
  }
  init(1, 0, n - 1);
  while (q--) {
    unsigned long long type, l, r;
    cin >> type >> l >> r;
    l--, r--;
    if (type == 1) {
      unsigned long long c;
      cin >> c;
      update(1, 0, n - 1, l, r, c);
      continue;
    }
    bool fl = 0;
    unsigned long long d;
    cin >> d;
    if (d == r - l + 1) fl = 1;
    if (!fl) fl = get(1, 0, n - 1, l, r - d) == get(1, 0, n - 1, l + d, r);
    if (fl)
      cout << "YES\n";
    else
      cout << "NO\n";
  }
  return 0;
}
