#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;   }