Advertisement
Ankit_132

G

Oct 12th, 2023
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.45 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4.  
  5. using namespace std;
  6.  
  7. #define ll     long long
  8. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  9. #define pb     push_back
  10.  
  11.  
  12. class cy
  13. {
  14.     public:
  15.     const int N = 2e5+10;
  16.     int n;
  17.     ll int *y, *cx;
  18.     cy()
  19.     {
  20.         y = new ll int[4*N];cx = new ll int[4*N];
  21.     }
  22.     void cyc(vector<ll int> &b, int n)
  23.     {
  24.         this->n = n;build_y(b, n);
  25.     }
  26.     void cyp(int v, int l, int r)
  27.     {
  28.         if (cx[v]==0)return;
  29.         if (cx[v]!=0)
  30.         {
  31.             y[v]+=(r-l+1)*cx[v];
  32.             if (l!=r)
  33.             {
  34.                 cx[v<<1]+=cx[v];cx[v<<1|1]+=cx[v];
  35.             }
  36.         }
  37.         cx[v]=0;
  38.     }
  39.  
  40.     void build(int v, int l, int r, vector<ll int> &b)
  41.     {
  42.         cx[v]=0;
  43.         if (l==r)
  44.         {
  45.             y[v]=b[l];return;
  46.         }
  47.  
  48.         int m=(l+r)>>1;
  49.         build(v<<1,l,m, b);build(v<<1|1,m+1,r, b);
  50.         y[v]=y[v<<1]+y[v<<1|1];
  51.     }
  52.  
  53.     void update(int v, int l, int r, int ss, int se, ll int val)
  54.     {
  55.         cyp(v,l,r);
  56.  
  57.         if (ss>se)return;
  58.  
  59.         if (l==ss && r==se)
  60.         {
  61.             y[v]+=val*(r-l+1);
  62.             if (l!=r)
  63.             {cx[v<<1]+=val;cx[v<<1|1]+=val;}
  64.             return;
  65.         }
  66.  
  67.         int m=(l+r)>>1;
  68.         update(v<<1,l,m,ss,min(se,m),val);update(v<<1|1,m+1,r,max(m+1,ss),se,val);
  69.         y[v]=y[v<<1]+y[v<<1|1];
  70.     }
  71.  
  72.     ll int query(int v, int l, int r, int ss, int se)
  73.     {
  74.         cyp(v,l,r);
  75.         if (ss>se)return 0;
  76.         if (l==ss && r == se)return y[v];
  77.         int m=(l+r)>>1;return query(v<<1,l,m,ss,min(se,m)) + query(v<<1|1,m+1,r,max(m+1,ss),se);
  78.     }
  79.  
  80.     void build_y(vector<ll int> &b, ll int n)
  81.     {
  82.         build(1, 0, n-1, b);
  83.     }
  84.  
  85.     void updateRange(int l, int r, ll int val)
  86.     {
  87.         update(1,0,n-1,l,r,val);
  88.     }
  89.  
  90.     ll int gg(int l, int r)
  91.     {
  92.         return query(1,0,n-1,l,r);
  93.     }
  94. };
  95.  
  96. int main()
  97. {
  98.     cy sgt;
  99.  
  100.     _test
  101.     {
  102.         int n, m;
  103.         cin>>n>>m;
  104.  
  105.         string s;
  106.         cin>>s;
  107.  
  108.         vector<ll int> x(n);
  109.  
  110.         for(int i=0; i<n; i++)
  111.             x[i] = s[i] - 'a';
  112.  
  113.         sgt.cyc(x, n);
  114.  
  115.         set<int> pr2;
  116.         set<int> pr3;
  117.  
  118.         for(int i=0; i<n-1; i++)
  119.         {
  120.             if(s[i] == s[i+1])      pr2.insert(i+1);
  121.             if(i+2<n && s[i] == s[i+2])
  122.                 pr3.insert(i+2);
  123.         }
  124.  
  125.         pr2.insert(1e6);
  126.         pr3.insert(1e6);
  127.  
  128.         while(m--)
  129.         {
  130.             int t;
  131.             cin>>t;
  132.  
  133.             if(t == 1)
  134.             {
  135.                 int l, r, x;
  136.                 cin>>l>>r>>x;
  137.  
  138.                 l--, r--;
  139.  
  140.                 if(l > 0)
  141.                 {   if(sgt.gg(l-1, l-1)%26 == sgt.gg(l, l)%26)        pr2.erase(l);   }
  142.                 if(r+1 < n)
  143.                 {   if(sgt.gg(r, r)%26 == sgt.gg(r+1, r+1)%26)        pr2.erase(r+1); }
  144.                 if(l-1 > 0)
  145.                 {   if(sgt.gg(l-2, l-2)%26 == sgt.gg(l, l)%26)        pr3.erase(l);   }
  146.                 if(l > 0 && l+1 <= r)
  147.                 {   if(sgt.gg(l-1, l-1)%26 == sgt.gg(l+1, l+1)%26)    pr3.erase(l+1); }
  148.                 if(r+2 < n)
  149.                 {   if(sgt.gg(r, r)%26 == sgt.gg(r+2, r+2)%26)        pr3.erase(r+2); }
  150.                 if(r-1 >= l && r+1 < n)
  151.                 {   if(sgt.gg(r-1, r-1)%26 == sgt.gg(r+1, r+1)%26)    pr3.erase(r+1); }
  152.  
  153.                 sgt.updateRange(l, r, x%26);
  154.  
  155.                 if(l > 0)
  156.                 {   if(sgt.gg(l-1, l-1)%26 == sgt.gg(l, l)%26)        pr2.insert(l);   }
  157.                 if(r+1 < n)
  158.                 {   if(sgt.gg(r, r)%26 == sgt.gg(r+1, r+1)%26)        pr2.insert(r+1); }
  159.                 if(l-1 > 0)
  160.                 {   if(sgt.gg(l-2, l-2)%26 == sgt.gg(l, l)%26)        pr3.insert(l);   }
  161.                 if(l > 0 && l+1 <= r)
  162.                 {   if(sgt.gg(l-1, l-1)%26 == sgt.gg(l+1, l+1)%26)    pr3.insert(l+1); }
  163.                 if(r+2 < n)
  164.                 {   if(sgt.gg(r, r)%26 == sgt.gg(r+2, r+2)%26)        pr3.insert(r+2); }
  165.                 if(r-1 >= l && r+1 < n)
  166.                 {   if(sgt.gg(r-1, r-1)%26 == sgt.gg(r+1, r+1)%26)    pr3.insert(r+1); }
  167.             }
  168.             else
  169.             {
  170.                 int l, r;
  171.                 cin>>l>>r;
  172.                 l--, r--;
  173.                 if(*pr2.lower_bound(l+1) <= r || *pr3.lower_bound(l+2) <= r)
  174.                     cout<<"No\n";
  175.                 else
  176.                     cout<<"Yes\n";
  177.             }
  178.         }
  179.     }
  180. }
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement