#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
unsigned long long p1 = 1e9 + 7, q1 = 1e4 + 7;
unsigned long long p2 = 1e9 + 9, q2 = 1e4 + 9;
pair<unsigned long long, unsigned long long> tree[N * 4];
unsigned long long mark[N * 4];
unsigned long long power1[N], power2[N];
unsigned long long sum1[N], sum2[N];
void pushdown(int k, int m, int n) {
  int z1 = k << 1, z2 = z1 + 1;
  if (mark[k]) {
    tree[k].first = sum1[n - m] * mark[k] % p1;
    tree[k].second = sum2[n - m] * mark[k] % p2;
    mark[z1] = mark[z2] = mark[k];
    mark[k] = 0;
  }
}
void pushup(int k, int m, int n) {
  int z1 = k << 1, z2 = z1 + 1;
  int mid = (m + n) >> 1;
  pair<unsigned long long, unsigned long long> a1, a2;
  if (mark[z1]) {
    a1 =
        make_pair(sum1[mid - m] * mark[z1] % p1, sum2[mid - m] * mark[z1] % p2);
  } else
    a1 = tree[z1];
  if (mark[z2]) {
    a2 = make_pair(sum1[n - mid - 1] * mark[z2] % p1,
                   sum2[n - mid - 1] * mark[z2] % p2);
  } else
    a2 = tree[z2];
  tree[k].first = (a1.first * power1[n - mid] % p1 + a2.first) % p1;
  tree[k].second = (a1.second * power2[n - mid] % p2 + a2.second) % p2;
}
void modify(int k, int m, int n, int l, int r, int c) {
  if (m > r || n < l) return;
  if (m >= l && n <= r) {
    mark[k] = c;
    return;
  }
  pushdown(k, m, n);
  int z1 = k << 1, z2 = z1 + 1, mid = (m + n) >> 1;
  modify(z1, m, mid, l, r, c);
  modify(z2, mid + 1, n, l, r, c);
  pushup(k, m, n);
}
pair<unsigned long long, unsigned long long> query(int k, int m, int n, int l,
                                                   int r) {
  if (m > r || n < l) return make_pair(0, 0);
  if (m >= l && n <= r) {
    pair<unsigned long long, unsigned long long> t;
    if (mark[k])
      t = make_pair(sum1[n - m] * mark[k] % p1, sum2[n - m] * mark[k] % p2);
    else
      t = tree[k];
    t.first = t.first * power1[r - n] % p1;
    t.second = t.second * power2[r - n] % p2;
    return t;
  }
  pushdown(k, m, n);
  int z1 = k << 1, z2 = z1 + 1, mid = (m + n) >> 1;
  pair<unsigned long long, unsigned long long> t = query(z1, m, mid, l, r);
  pair<unsigned long long, unsigned long long> z = query(z2, mid + 1, n, l, r);
  pushup(k, m, n);
  t.first = (t.first + z.first) % p1;
  t.second = (t.second + z.second) % p2;
  return t;
}
int main() {
  power1[0] = power2[0] = 1;
  for (int i = 1; i < N; ++i) {
    power1[i] = power1[i - 1] * q1 % p1;
    power2[i] = power2[i - 1] * q2 % p2;
  }
  sum1[0] = power1[0];
  sum2[0] = power2[0];
  for (int i = 1; i < N; ++i) {
    sum1[i] = (sum1[i - 1] + power1[i]) % p1;
    sum2[i] = (sum2[i - 1] + power2[i]) % p2;
  }
  int n, m, K;
  scanf("%d%d%d", &n, &m, &K);
  for (int i = 1; i <= n; ++i) {
    int ch;
    while (ch = getchar(), !isdigit(ch))
      ;
    ch -= '0';
    ++ch;
    modify(1, 1, n, i, i, ch);
  }
  for (int i = 1; i <= m + K; ++i) {
    int ch, L, R, d;
    scanf("%d%d%d%d", &ch, &L, &R, &d);
    if (ch == 1) {
      ++d;
      modify(1, 1, n, L, R, d);
    } else {
      int len = R - (L + d) + 1;
      int flag = 1;
      if (len > 0) {
        if (query(1, 1, n, L, L + len - 1) != query(1, 1, n, L + d, R))
          flag = 0;
      }
      if (flag)
        puts("YES");
      else
        puts("NO");
    }
  }
  return 0;
}
