func_code_string: #include <bits/stdc++.h>   using namespace std;   const unsigned long long MOD = 1e8 + 7;   const unsigned long long base = 71;   const unsigned long long max_n = 2e5 + 400;   unsigned long long n, m, k, q;   string s;   unsigned long long pw[2 * max_n + 200];   unsigned long long save[20][2 * max_n + 200];   unsigned long long seg[10 * max_n], lazy[10 * max_n];   void init(unsigned long long v, unsigned long long b, unsigned long long e) {     lazy[v] = -1;     if (b == e) {       seg[v] = s[b];       return;     }     unsigned long long mid = (b + e) / 2;     init(v << 1, b, mid);     init(v << 1 ^ 1, mid + 1, e);     seg[v] = (seg[v << 1] * pw[e - mid] + seg[v << 1 ^ 1]) % MOD;   }   void shift(unsigned long long v, unsigned long long b, unsigned long long e,              unsigned long long mid) {     if (lazy[v] == -1) return;     lazy[v << 1] = lazy[v << 1 ^ 1] = lazy[v];     seg[v << 1] = save[lazy[v]][mid - b];     seg[v << 1 ^ 1] = save[lazy[v]][e - mid - 1];     lazy[v] = -1;   }   void update(unsigned long long v, unsigned long long b, unsigned long long e,               unsigned long long l, unsigned long long r,               unsigned long long val) {     if (b > r || l > e) return;     if (l <= b && e <= r) {       seg[v] = save[val][e - b];       lazy[v] = val;       return;     }     unsigned long long mid = (b + e) / 2;     shift(v, b, e, mid);     update(v << 1, b, mid, l, r, val);     update(v << 1 ^ 1, mid + 1, e, l, r, val);     seg[v] = (seg[v << 1] * pw[e - mid] + seg[v << 1 ^ 1]) % MOD;   }   unsigned long long get(unsigned long long v, unsigned long long b,                          unsigned long long e, unsigned long long l,                          unsigned long long r) {     if (b > r || l > e) return 0;     if (l <= b && e <= r) return seg[v];     unsigned long long mid = (b + e) / 2;     shift(v, b, e, mid);     unsigned long long first = get(v << 1, b, mid, l, r);     unsigned long long second = get(v << 1 ^ 1, mid + 1, e, l, r);     first = (first * pw[max(0, int(min(r, e) - mid))] + second) % MOD;     return first;   }   int main() {     ios_base::sync_with_stdio(false), cin.tie(0);     cin >> n >> m >> k;     q = m + k;     cin >> s;     pw[0] = 1;     for (unsigned long long i = 1; i < max_n; i++)       pw[i] = (pw[i - 1] * base) % MOD;     for (unsigned long long i = 0; i < 10; i++) {       save[i][0] = i + 48;       for (unsigned long long j = 1; j < max_n; j++)         save[i][j] = (save[i][j - 1] * base + (i + 48)) % MOD;     }     init(1, 0, n - 1);     while (q--) {       unsigned long long type, l, r;       cin >> type >> l >> r;       l--, r--;       if (type == 1) {         unsigned long long c;         cin >> c;         update(1, 0, n - 1, l, r, c);         continue;       }       bool fl = 0;       unsigned long long d;       cin >> d;       if (d == r - l + 1) fl = 1;       if (!fl) fl = get(1, 0, n - 1, l, r - d) == get(1, 0, n - 1, l + d, r);       if (fl)         cout <<  YES n ;       else         cout <<  NO n ;     }     return 0;   }   