#include <bits/stdc++.h>
using namespace std;
class Data {
 public:
  long long lazy, val;
  Data() {
    lazy = -1;
    val = 0;
  }
};
long long pr = 107;
long long c_pr[100010];
Data tree[4 * 100010];
long long ara[100010];
void updval(int node, int le_ran, int ri_ran, long long lazy) {
  long long poo = c_pr[ri_ran] - c_pr[le_ran - 1];
  poo %= 1000000007;
  if (poo < 0) {
    poo = (poo + 1000000007) % 1000000007;
  }
  tree[node].val = poo * lazy;
  tree[node].val %= 1000000007;
  tree[node].lazy = lazy;
}
void update(int node, int le_ran, int ri_ran) {
  if (tree[node].lazy != -1) {
    if (le_ran != ri_ran) {
      int mid = (le_ran + ri_ran) / 2;
      updval(node * 2, le_ran, mid, tree[node].lazy);
      updval((node * 2) + 1, mid + 1, ri_ran, tree[node].lazy);
    }
    tree[node].lazy = -1;
  }
}
void update_range(int node, int le_ran, int ri_ran, int le, int ri,
                  long long val) {
  if ((ri_ran < le) || (le_ran > ri)) {
    return;
  }
  if ((le_ran >= le) && (ri_ran <= ri)) {
    updval(node, le_ran, ri_ran, val);
    return;
  }
  update(node, le_ran, ri_ran);
  int mid = (le_ran + ri_ran) / 2;
  update_range(node * 2, le_ran, mid, le, ri, val);
  update_range((node * 2) + 1, mid + 1, ri_ran, le, ri, val);
  tree[node].val = tree[node * 2].val + tree[(node * 2) + 1].val;
  tree[node].val %= 1000000007;
}
long long query(int node, int le_ran, int ri_ran, int le, int ri) {
  if ((ri_ran < le) || (le_ran > ri)) {
    return 0;
  }
  if ((le_ran >= le) && (ri_ran <= ri)) {
    return tree[node].val;
  }
  update(node, le_ran, ri_ran);
  int mid = (le_ran + ri_ran) / 2;
  long long ans = 0;
  ans += query(node * 2, le_ran, mid, le, ri);
  ans %= 1000000007;
  ans += query((node * 2) + 1, mid + 1, ri_ran, le, ri);
  ans %= 1000000007;
  return ans;
}
string str;
int n, q;
long long bm(long long base, long long power) {
  if (power == 0) {
    return 1;
  }
  if (power % 2 == 0) {
    long long ret = bm(base, power / 2);
    return (ret * ret) % 1000000007;
  } else {
    return (base * bm(base, power - 1)) % 1000000007;
  }
}
long long mod_inv(long long num) { return bm(num, 1000000007 - 2); }
long long get_hash(int l, int r) {
  long long yo = query(1, 1, n, l, r);
  yo %= 1000000007;
  if (yo < 0) {
    yo = (yo + 1000000007) % 1000000007;
  }
  yo = yo * mod_inv(bm(pr, l));
  yo %= 1000000007;
  return yo;
}
int main() {
  std::ios_base::sync_with_stdio(false);
  int m, k;
  cin >> n >> m >> k;
  q = m + k;
  long long tmp_pr = 1;
  for (int i = 1; i <= n; i++) {
    c_pr[i] = c_pr[i - 1] + tmp_pr;
    c_pr[i] %= 1000000007;
    tmp_pr = tmp_pr * pr;
    tmp_pr %= 1000000007;
  }
  cin >> str;
  for (int i = 0; i <= n - 1; i++) {
    update_range(1, 1, n, i + 1, i + 1, str[i] - '0');
  }
  for (int i = 1; i <= q; i++) {
    int cmd;
    cin >> cmd;
    int l, r, val;
    cin >> l >> r >> val;
    if (cmd == 1) {
      update_range(1, 1, n, l, r, val);
    } else {
      if (get_hash(l, r - val) == get_hash(l + val, r)) {
        cout << "YES\n";
      } else {
        cout << "NO\n";
      }
    }
  }
  return 0;
}
