#include <bits/stdc++.h>
using namespace std;
template <class T>
using vv = vector<vector<T>>;
template <class T>
ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  for (int(i) = 0; (i) < (t.size()); ++(i)) {
    os << t[i] << ",";
  }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
const long long MOD = 1e9 + 9;
const int N = (1 << 17), r = 11451;
struct NODE {
  long long h, q, r;
  NODE(int v = 0) {
    h = v;
    q = 0;
    r = (v ? ::r : 1);
  }
  static NODE e;
};
NODE NODE::e = NODE();
ostream &operator<<(ostream &os, const NODE &t) {
  return os << "(" << t.h << "," << t.q << "," << t.r << ")";
}
NODE seg[2 * N + 10];
vector<long long> ser(N);
inline void lazy_eval(int k, int a, int b) {
  if (!seg[k].q) return;
  if (seg[k].q) seg[k].h = seg[k].q * ser[b - a - 1] % MOD;
  if (2 * k <= 2 * N + 5) {
    seg[2 * k + 1].q = seg[k].q;
    seg[2 * k + 2].q = seg[k].q;
  }
  seg[k].q = 0;
}
NODE pl(const NODE a, const NODE b) {
  NODE re;
  re.h = (a.h * b.r % MOD + b.h) % MOD;
  re.r = a.r * b.r % MOD;
  return re;
}
inline void update_node(int k) { seg[k] = pl(seg[2 * k + 1], seg[2 * k + 2]); }
void update(int l, int r, long long q, int k = 0, int a = 0, int b = N) {
  lazy_eval(k, a, b);
  if (b <= l || r <= a) return;
  if (l <= a && b <= r) {
    seg[k].q = q;
    lazy_eval(k, a, b);
    return;
  }
  int m = (a + b) / 2;
  update(l, r, q, 2 * k + 1, a, m);
  update(l, r, q, 2 * k + 2, m, b);
  update_node(k);
}
NODE get(int l, int r, int k = 0, int a = 0, int b = N) {
  lazy_eval(k, a, b);
  if (b <= l || r <= a) return NODE::e;
  if (l <= a && b <= r) {
    return seg[k];
  }
  int m = (a + b) / 2;
  NODE vl = get(l, r, 2 * k + 1, a, m);
  NODE vr = get(l, r, 2 * k + 2, m, b);
  update_node(k);
  return pl(vl, vr);
}
int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  ser[0] = 1;
  for (int(i) = 0; (i) < (N - 1); ++(i))
    ser[i + 1] = (1 + ser[i] * r % MOD) % MOD;
  int n, m, t;
  cin >> n >> m >> t;
  string str;
  cin >> str;
  int a, l, r, x;
  for (int(i) = 0; (i) < (n); ++(i)) seg[(1 << 17) - 1 + i] = NODE(str[i]);
  for (int(i) = ((1 << 17) - 1) - 1; (i) >= 0; --(i)) update_node(i);
  for (int(i) = 0; (i) < (t + m); ++(i)) {
    cin >> a >> l >> r >> x;
    --l;
    if (a == 1) {
      update(l, r, x + '0');
    } else {
      cout << (get(l, r - x).h == get(l + x, r).h ? "YES" : "NO") << endl;
    }
  }
  return 0;
}
