#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 7;
const long long M = 1e3 + 7;
const long long INF = 1e9 + 7;
const long long Mod = 1e9 + 7;
long long p = 31;
struct Otrevo_Derezkov {
  long long l, r;
  long long h;
  long long push = -1;
} t[4 * N];
string second;
long long deg[N], d[N];
inline long long Mul(long long x, long long y) { return x * y % Mod; }
inline long long Sum(long long x, long long y) { return (x + y) % Mod; }
long long Len(long long v) { return t[v].r - t[v].l + 1; }
void Prepare() {
  deg[0] = 1;
  d[0] = 1;
  for (long long i = 1; i < N; ++i) {
    deg[i] = Mul(deg[i - 1], p);
    d[i] = Sum(d[i - 1], deg[i]);
  }
}
void comb(long long v) {
  t[v].h = Sum(Mul(t[2 * v].h, deg[Len(2 * v + 1)]), t[2 * v + 1].h);
}
void Build(long long v, long long l, long long r) {
  t[v].l = l;
  t[v].r = r;
  if (l == r) {
    t[v].h = second[l] - 47;
    return;
  }
  long long m = (l + r) / 2;
  Build(2 * v, l, m);
  Build(2 * v + 1, m + 1, r);
  comb(v);
}
void Pussing(long long v) {
  if (t[v].push == -1) return;
  t[v].h = Mul(t[v].push, d[Len(v) - 1]);
  t[2 * v].push = t[v].push;
  t[2 * v + 1].push = t[v].push;
  t[v].push = -1;
}
void Update(long long v, long long l, long long r, long long x) {
  Pussing(v);
  if (t[v].l > r || t[v].r < l) return;
  if (t[v].l >= l && t[v].r <= r) {
    t[v].push = x;
    Pussing(v);
    return;
  }
  Update(2 * v, l, r, x);
  Update(2 * v + 1, l, r, x);
  comb(v);
}
pair<long long, long long> Hash(long long v, long long l, long long r) {
  Pussing(v);
  if (t[v].l > r || t[v].r < l)
    return {0, 0};
  else if (t[v].l >= l && t[v].r <= r)
    return {t[v].h, Len(v)};
  else {
    pair<long long, long long> h1 = Hash(2 * v, l, r);
    pair<long long, long long> h2 = Hash(2 * v + 1, l, r);
    return {Sum(Mul(h1.first, deg[h2.second]), h2.first),
            Sum(h1.second, h2.second)};
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  Prepare();
  long long n, m, k;
  cin >> n >> m >> k >> second;
  Build(1, 0, n - 1);
  long long z = m + k;
  while (z-- > 0) {
    long long type, l, r, x;
    cin >> type >> l >> r >> x;
    --l;
    --r;
    if (type == 1) {
      Update(1, l, r, x + 1);
    } else {
      long long h1 = Hash(1, l, r - x).first;
      long long h2 = Hash(1, l + x, r).first;
      cout << (h1 == h2 ? "YES" : "NO") << '\n';
    }
  }
}
