#include <bits/stdc++.h>
using namespace std;
int n, q, ex, lazy[2 * 131072];
long long st[2 * 131072], powers[131072], pinv[131072];
string s;
long long mod(long long a) {
  if (a >= 0 && a < 1000000007) return a;
  return (a >= 0) ? (a % 1000000007)
                  : ((a % 1000000007) + 1000000007) % 1000000007;
}
long long mod_add(long long a, long long b) { return mod(mod(a) + mod(b)); }
long long mod_mult(long long a, long long b) { return mod(mod(a) * mod(b)); }
long long mod_pow(long long a, long long b) {
  long long ret = 1;
  while (b) {
    if (b & 1) ret = mod_mult(ret, a);
    a = mod_mult(a, a);
    b /= 2;
  }
  return ret;
}
long long mod_inv(long long a) { return mod_pow(a, 1000000007 - 2); }
inline void build(int node, int low, int high) {
  if (low == high) {
    st[node] = (int)s[low];
    lazy[node] = 0;
    return;
  }
  build(2 * node + 1, low, (low + high) / 2);
  build(2 * node + 2, (low + high) / 2 + 1, high);
  st[node] = mod_add(st[2 * node + 2], mod_mult(powers[high - (low + high) / 2],
                                                st[2 * node + 1]));
}
inline void upgrade(int node, int low, int high) {
  if (lazy[node]) {
    st[node] =
        mod_mult(mod_mult(powers[high - low + 1] - 1, pinv[1]), lazy[node]);
    if (low != high) {
      lazy[2 * node + 1] = lazy[node];
      lazy[2 * node + 2] = lazy[node];
    }
    lazy[node] = 0;
  }
}
inline void update(int node, int low, int high, int qx, int qy, int c) {
  upgrade(node, low, high);
  if (qy < low || qx > high) return;
  if (qx <= low && high <= qy) {
    lazy[node] = c;
    upgrade(node, low, high);
    return;
  }
  update(2 * node + 1, low, (low + high) / 2, qx, qy, c);
  update(2 * node + 2, (low + high) / 2 + 1, high, qx, qy, c);
  st[node] = mod_add(st[2 * node + 2], mod_mult(powers[high - (low + high) / 2],
                                                st[2 * node + 1]));
}
inline long long query(int node, int low, int high, int qx, int qy) {
  upgrade(node, low, high);
  if (qy < low || qx > high) return 0;
  if (qx <= low && high <= qy) return st[node];
  if (qx > (low + high) / 2)
    return query(2 * node + 2, (low + high) / 2 + 1, high, qx, qy);
  if (qy < (low + high) / 2 + 1)
    return query(2 * node + 1, low, (low + high) / 2, qx, qy);
  return mod_add(query(2 * node + 2, (low + high) / 2 + 1, high, qx, qy),
                 mod_mult(powers[min(qy, high) - (low + high) / 2],
                          query(2 * node + 1, low, (low + high) / 2, qx, qy)));
}
inline bool is_periodic(int l, int r, int c) {
  ex = (r - l + 1) % c;
  r -= ex;
  long long base = query(0, 0, n - 1, l, l + c - 1),
            tot = query(0, 0, n - 1, l, r);
  base = mod_mult(base, mod_mult(powers[r - l + 1] - 1, pinv[c]));
  if (base != tot) return false;
  if (ex == 0) return true;
  return (query(0, 0, n - 1, l, l + ex - 1) ==
          query(0, 0, n - 1, r + 1, r + ex));
}
int main(void) {
  powers[0] = 1;
  for (int i = 1; i < 131072; i++) {
    powers[i] = mod_mult(powers[i - 1], 196366714);
    pinv[i] = mod_inv(powers[i] - 1);
  }
  cin >> n >> q >> ex;
  q += ex;
  cin >> s;
  build(0, 0, n - 1);
  for (int i = 0; i < q; i++) {
    int a, l, r;
    scanf("%d%d%d", &a, &l, &r);
    l--;
    r--;
    if (a == 1) {
      char c;
      cin >> c;
      update(0, 0, n - 1, l, r, (int)c);
    } else {
      int c;
      scanf("%d", &c);
      if (is_periodic(l, r, c))
        printf("YES\n");
      else
        printf("NO\n");
    }
  }
  return 0;
}
