#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream st(s);
  string first;
  while (getline(st, first, c)) v.push_back(first);
  return move(v);
}
void err(vector<string>::iterator it) {}
template <typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
  cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << '\n';
  err(++it, args...);
}
template <typename T1, typename T2>
inline ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <typename T>
inline ostream& operator<<(ostream& os, const vector<T>& v) {
  bool _ = 1;
  os << "[";
  for (auto i : v) {
    if (!_) os << ", ";
    os << i;
    _ = 0;
  }
  return os << "]";
}
template <typename T>
inline ostream& operator<<(ostream& os, const set<T>& v) {
  os << "-BEGIN SET-\n";
  bool _ = 1;
  for (auto i : v) {
    if (!_) os << "\n";
    os << i;
    _ = 0;
  }
  return os << "\n-END SET-";
}
template <typename T>
inline ostream& operator<<(ostream& os, const unordered_set<T>& v) {
  os << "-BEGIN SET-\n";
  bool _ = 1;
  for (auto i : v) {
    if (!_) os << "\n";
    os << i;
    _ = 0;
  }
  return os << "\n--END SET--";
}
template <typename T1, typename T2>
inline ostream& operator<<(ostream& os, const map<T1, T2>& v) {
  os << "-BEGIN MAP-\n";
  bool _ = 1;
  for (auto i : v) {
    if (!_) os << "\n";
    os << " " << i;
    _ = 0;
  }
  return os << "\n"
            << "--END MAP--";
}
template <typename T1, typename T2>
inline ostream& operator<<(ostream& os, const unordered_map<T1, T2>& v) {
  os << "-BEGIN MAP-\n";
  bool _ = 1;
  for (auto i : v) {
    if (!_) os << endl;
    os << " " << i;
    _ = 0;
  }
  return os << "\n--END MAP--";
}
int N, M, K;
long long dp[12][100010];
long long pw[100010];
long long tree[100010 * 4], lazy[100010 * 4];
long long data[100010];
long long getV(int l, int r, int d) {
  return ((dp[d][r] - dp[d][l - 1]) % 1073676287 + 1073676287) % 1073676287;
}
void build(int index, int s, int e) {
  if (s > e) return;
  if (s == e) {
    tree[index] = data[s];
    return;
  }
  int mid = (s + e) / 2;
  build(index * 2, s, mid);
  build(index * 2 + 1, mid + 1, e);
  tree[index] = (tree[index * 2] + tree[index * 2 + 1]) % 1073676287;
}
void push(int index, int s, int e) {
  if (lazy[index] != 0) {
    tree[index] = getV(s, e, lazy[index]);
    if (s != e) {
      lazy[index * 2] = lazy[index];
      lazy[index * 2 + 1] = lazy[index];
    }
    lazy[index] = 0;
  }
}
void modify(int index, int s, int e, int i, int j, long long d) {
  push(index, s, e);
  if (s > e || s > j || e < i) return;
  if (s >= i && e <= j) {
    tree[index] = getV(s, e, d);
    if (s != e) {
      lazy[index * 2] = d;
      lazy[index * 2 + 1] = d;
    }
    return;
  }
  int mid = (s + e) / 2;
  modify(index * 2, s, mid, i, j, d);
  modify(index * 2 + 1, mid + 1, e, i, j, d);
  tree[index] = (tree[index * 2] + tree[index * 2 + 1]) % 1073676287;
}
long long query(int index, int s, int e, int i, int j) {
  if (s > e || s > j || e < i) return 0;
  push(index, s, e);
  if (s >= i && e <= j) return tree[index];
  int mid = (s + e) / 2;
  long long l = query(index * 2, s, mid, i, j);
  long long r = query(index * 2 + 1, mid + 1, e, i, j);
  return (l + r) % 1073676287;
}
string s;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> M >> K;
  pw[0] = 1;
  for (int i = 0; i <= 10; i++) {
    for (int j = 1; j <= N; j++) {
      pw[j] = (pw[j - 1] * 13) % 1073676287;
      dp[i][j] = (dp[i][j - 1] + (i * pw[j] % 1073676287)) % 1073676287;
    }
  }
  cin >> s;
  for (int i = 1; i <= N; i++) {
    data[i] = ((s[i - 1] - '0' + 1) * pw[i]) % 1073676287;
  }
  build(1, 1, 100010);
  for (int i = 0; i < M + K; i++) {
    int c, l, r;
    long long d;
    cin >> c >> l >> r >> d;
    if (c == 1) {
      modify(1, 1, 100010, l, r, d + 1);
    } else if (c == 2) {
      long long p1 = (query(1, 1, 100010, l, r - d) * pw[d]) % 1073676287;
      long long p2 = query(1, 1, 100010, l + d, r);
      if (p1 == p2 || l == r)
        cout << "YES"
             << "\n";
      else
        cout << "NO"
             << "\n";
    }
  }
}
