Advertisement
Guest User

Untitled

a guest
Jun 30th, 2022
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll unsigned long long
  3. #define mod 1000000007
  4. #define fast ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  5. using namespace std;
  6.  
  7. const ll m = 1e9+9;
  8. const ll p = 131;
  9. ll hashString(string s) {
  10.     ll ans = 0;
  11.     ll p_pow = 1;
  12.     for(ll i=0; i<s.size(); i++) {
  13.         ans = (ans + (s[i]-'a'+1)*p_pow)%m;
  14.         p_pow = (p_pow*p)%m;
  15.     }
  16.     return ans;
  17. }
  18.  
  19. ll modpow(ll x, ll y) {
  20.     ll res = 1;  
  21.  
  22.     x = x % m;
  23.     if (x == 0) return 0;
  24.     while (y > 0)
  25.     {
  26.         if (y & 1)
  27.             res = (res*x) % m;
  28.  
  29.         y = y>>1;
  30.         x = (x*x) % m;
  31.     }
  32.     return res;
  33. }
  34.  
  35. ll combine1(ll s1, ll s2, ll l1, ll l2) {
  36.     // cout<<l1<<" "<<l2<<"::\n";
  37.     ll val = modpow(p, l1);
  38.     return ((s2*val)%mod+s1)%mod;
  39. }
  40.  
  41. ll combine2(ll s1, ll s2, ll l1, ll l2) {
  42.     ll val = modpow(p, l2);
  43.     return ((s1*val)%mod+s2)%mod;
  44. }
  45.  
  46.  
  47. struct segmentTree {
  48.     vector<ll> t1, t2;
  49.     string s;
  50.     ll n;
  51.  
  52.     segmentTree(ll n) {
  53.         this->n = n;
  54.         t1.resize(4*n);
  55.         t2.resize(4*n);
  56.     }
  57.  
  58.     segmentTree(string s) : segmentTree(s.size()) {
  59.         this->s = s;
  60.         build(1, 0, n-1);
  61.     }
  62.  
  63.     void build(ll v, ll tl, ll tr) {
  64.         if(tl==tr) {
  65.             t1[v] = s[tl]-'a'+1;
  66.             t2[v] = t1[v];
  67.         }
  68.         else {
  69.             ll tm = (tl+tr)/2;
  70.             build(v*2, tl, tm);
  71.             build(v*2+1, tm+1, tr);
  72.             if(tm-tl+1==0) {
  73.                 t1[v] = t1[v*2+1];
  74.                 t2[v] = t2[v*2+1];
  75.             }
  76.             else if(tr-tm==0) {
  77.                 t1[v] = t1[v*2];
  78.                 t2[v] = t2[v*2];
  79.             }
  80.             else {
  81.                 t1[v] = combine1(t1[v*2], t1[v*2+1], tm-tl+1, tr-tm);
  82.                 t2[v] = combine2(t2[v*2], t2[v*2+1], tm-tl+1, tr-tm);
  83.             }
  84.         }
  85.         // cout<<tl<<" "<<tr<<" "<<t1[v]<<" "<<t2[v]<<" "<<"::\n";
  86.     }
  87.  
  88.     void update(ll v, ll tl, ll tr, ll pos, char new_val) {
  89.         if(tl==tr) {
  90.             // cout<<new_val<<"::\n";
  91.             t1[v] = (new_val-'a'+1);
  92.             t2[v] = t1[v];
  93.         }
  94.         else {
  95.             ll tm = (tl+tr)/2;
  96.             if(pos<=tm)
  97.                 update(v*2, tl, tm, pos, new_val);
  98.             else
  99.                 update(v*2+1, tm+1, tr, pos, new_val);
  100.             if(tm-tl+1==0) {
  101.                 t1[v] = t1[v*2+1];
  102.                 t2[v] = t2[v*2+1];
  103.             }
  104.             else if(tr-tm==0) {
  105.                 t1[v] = t1[v*2];
  106.                 t2[v] = t2[v*2];
  107.             }
  108.             else {
  109.                 t1[v] = combine1(t1[v*2], t1[v*2+1], tm-tl+1, tr-tm);
  110.                 t2[v] = combine2(t2[v*2], t2[v*2+1], tm-tl+1, tr-tm);
  111.             }
  112.  
  113.         }
  114.     }
  115.  
  116.     vector<ll> sum(ll v, ll tl, ll tr, ll l, ll r) {
  117.         if(l>r)
  118.             return {0, 0, 0};
  119.         if(l==tl && r==tr)
  120.             return {t1[v], t2[v], r-l+1};
  121.         ll tm = (tl+tr)/2;
  122.         vector<ll> a = sum(v*2, tl, tm, l, min(r, tm));
  123.         vector<ll> b = sum(v*2+1, tm+1, tr, max(l, tm+1), r);
  124.  
  125.         if(a[2]==0)return {
  126.                     b[0],
  127.                     b[1],
  128.                     a[2]+b[2]
  129.                 };
  130.         else if(b[2]==0)return {
  131.                     a[0],
  132.                     a[1],
  133.                     a[2]+b[2]
  134.                 };
  135.         else
  136.             return {
  137.                     combine1(a[0], b[0], a[2], b[2]),
  138.                     combine2(a[1], b[1], a[2], b[2]),
  139.                     a[2]+b[2]
  140.                 };
  141.     }
  142. };
  143.  
  144. int main() {
  145.     #ifndef ONLINE_JUDGE
  146.     freopen("input.txt","r",stdin);
  147.     freopen("output.txt","w",stdout);
  148.     #endif
  149.  
  150.     // fast;
  151.     ll t = 1;
  152.     // cin>>t;
  153.     while(t--) {
  154.         ll n, m;
  155.         cin>>n>>m;
  156.         string s;   cin>>s;
  157.  
  158.         segmentTree tree(s);
  159.         // cout<<"end::\n";
  160.         // assert(s.size()==tree.sum(1, 0, n-1, 0, n-1)[2]);
  161.         // cout<<hashString(s)<<" "<<tree.sum(1, 0, n-1, 0, n-1)[0]<<"::\n";
  162.         // cout<<(hashString(s)==tree.sum(1, 0, n-1, 0, n-1)[0])<<"::\n";
  163.         ll q, k, a, b;
  164.         char x;
  165.         for(ll i=0; i<m; i++) {
  166.             cin>>q;
  167.             if(q==1) {
  168.                 cin>>k>>x;
  169.                 // cout<<x<<"::\n";
  170.                 tree.update(1, 0, n-1, k-1, x);
  171.             }
  172.             else {
  173.                 cin>>a>>b;
  174.                 vector<ll> value = tree.sum(1, 0, n-1, a-1, b-1);
  175.                 assert(value[2]==b-a+1);
  176.                 if(value[0]==value[1]) {
  177.                     cout<<"YES\n";
  178.                 }
  179.                 else {
  180.                     cout<<"NO\n";
  181.                 }
  182.             }
  183.         }
  184.     }
  185.  
  186. }
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement