func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long base = 17LL;   const long long MOD = 998244353LL;   const int MAXN = 1e5 + 10;   struct Node {     long long v;     long long tagv;     long long len;   } st[MAXN << 2];   long long a[MAXN];   inline long long fp(long long x, long long y) {     long long ret = 1LL;     while (y) {       if (y & 1) ret = ret * x % MOD;       x = x * x % MOD;       y >>= 1;     }     return ret;   }   long long inv = fp(base - 1, MOD - 2);   long long basep[MAXN];   Node operator+(const Node& a, const Node& b) {     Node ret;     ret.len = a.len + b.len;     ret.tagv = -1;     ret.v = (a.v * basep[b.len] % MOD + b.v) % MOD;     return ret;   }   void init() {     basep[0] = 1LL;     for (int i = 1; i < MAXN; i++) basep[i] = basep[i - 1] * base % MOD;   }   void setv(int o, long long v) {     st[o].v = (basep[st[o].len] - 1 + MOD) % MOD * v % MOD * inv % MOD;     st[o].tagv = v;   }   void pushup(int o) { st[o] = st[o << 1] + st[o << 1 | 1]; }   void pushdown(int o) {     if (st[o].tagv != -1) {       setv(o << 1, st[o].tagv);       setv(o << 1 | 1, st[o].tagv);       st[o].tagv = -1;     }   }   void build(int o, int l, int r) {     st[o].tagv = -1;     st[o].len = r - l + 1;     if (l == r) {       setv(o, a[l]);       return;     }     int m = l + r >> 1;     build(o << 1, l, m);     build(o << 1 | 1, m + 1, r);     pushup(o);   }   void update(int o, int l, int r, int L, int R, long long v) {     if (L <= l && r <= R) {       setv(o, v);       return;     }     pushdown(o);     int m = l + r >> 1;     if (L <= m) update(o << 1, l, m, L, R, v);     if (m < R) update(o << 1 | 1, m + 1, r, L, R, v);     pushup(o);   }   Node query(int o, int l, int r, int L, int R) {     if (L <= l && r <= R) return st[o];     pushdown(o);     int m = l + r >> 1;     if (R <= m) return query(o << 1, l, m, L, R);     if (m < L) return query(o << 1 | 1, m + 1, r, L, R);     return query(o << 1, l, m, L, R) + query(o << 1 | 1, m + 1, r, L, R);   }   char s[MAXN];   int main() {     init();     int n, m, k;     int x, l, r, y;     scanf( %d%d%d , &n, &m, &k);     scanf( %s , s);     for (int i = 1; i <= n; i++) a[i] = s[i - 1] -  0 ;     build(1, 1, n);     for (int i = 1; i <= m + k; i++) {       scanf( %d%d%d%d , &x, &l, &r, &y);       if (x == 1) {         update(1, 1, n, l, r, 1LL * (y));       } else {         if (y == (r - l + 1)) {           puts( YES );           continue;         }         if (query(1, 1, n, l + y, r).v == query(1, 1, n, l, r - y).v)           puts( YES );         else           puts( NO );       }     }     return 0;   }   