Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define _test int _TEST; cin>>_TEST; while(_TEST--)
- #define pb push_back
- class cy
- {
- public:
- const int N = 2e5+10;
- int n;
- ll int *y, *cx;
- cy()
- {
- y = new ll int[4*N];cx = new ll int[4*N];
- }
- void cyc(vector<ll int> &b, int n)
- {
- this->n = n;build_y(b, n);
- }
- void cyp(int v, int l, int r)
- {
- if (cx[v]==0)return;
- if (cx[v]!=0)
- {
- y[v]+=(r-l+1)*cx[v];
- if (l!=r)
- {
- cx[v<<1]+=cx[v];cx[v<<1|1]+=cx[v];
- }
- }
- cx[v]=0;
- }
- void build(int v, int l, int r, vector<ll int> &b)
- {
- cx[v]=0;
- if (l==r)
- {
- y[v]=b[l];return;
- }
- int m=(l+r)>>1;
- build(v<<1,l,m, b);build(v<<1|1,m+1,r, b);
- y[v]=y[v<<1]+y[v<<1|1];
- }
- void update(int v, int l, int r, int ss, int se, ll int val)
- {
- cyp(v,l,r);
- if (ss>se)return;
- if (l==ss && r==se)
- {
- y[v]+=val*(r-l+1);
- if (l!=r)
- {cx[v<<1]+=val;cx[v<<1|1]+=val;}
- return;
- }
- int m=(l+r)>>1;
- update(v<<1,l,m,ss,min(se,m),val);update(v<<1|1,m+1,r,max(m+1,ss),se,val);
- y[v]=y[v<<1]+y[v<<1|1];
- }
- ll int query(int v, int l, int r, int ss, int se)
- {
- cyp(v,l,r);
- if (ss>se)return 0;
- if (l==ss && r == se)return y[v];
- 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);
- }
- void build_y(vector<ll int> &b, ll int n)
- {
- build(1, 0, n-1, b);
- }
- void updateRange(int l, int r, ll int val)
- {
- update(1,0,n-1,l,r,val);
- }
- ll int gg(int l, int r)
- {
- return query(1,0,n-1,l,r);
- }
- };
- int main()
- {
- cy sgt;
- _test
- {
- int n, m;
- cin>>n>>m;
- string s;
- cin>>s;
- vector<ll int> x(n);
- for(int i=0; i<n; i++)
- x[i] = s[i] - 'a';
- sgt.cyc(x, n);
- set<int> pr2;
- set<int> pr3;
- for(int i=0; i<n-1; i++)
- {
- if(s[i] == s[i+1]) pr2.insert(i+1);
- if(i+2<n && s[i] == s[i+2])
- pr3.insert(i+2);
- }
- pr2.insert(1e6);
- pr3.insert(1e6);
- while(m--)
- {
- int t;
- cin>>t;
- if(t == 1)
- {
- int l, r, x;
- cin>>l>>r>>x;
- l--, r--;
- if(l > 0)
- { if(sgt.gg(l-1, l-1)%26 == sgt.gg(l, l)%26) pr2.erase(l); }
- if(r+1 < n)
- { if(sgt.gg(r, r)%26 == sgt.gg(r+1, r+1)%26) pr2.erase(r+1); }
- if(l-1 > 0)
- { if(sgt.gg(l-2, l-2)%26 == sgt.gg(l, l)%26) pr3.erase(l); }
- if(l > 0 && l+1 <= r)
- { if(sgt.gg(l-1, l-1)%26 == sgt.gg(l+1, l+1)%26) pr3.erase(l+1); }
- if(r+2 < n)
- { if(sgt.gg(r, r)%26 == sgt.gg(r+2, r+2)%26) pr3.erase(r+2); }
- if(r-1 >= l && r+1 < n)
- { if(sgt.gg(r-1, r-1)%26 == sgt.gg(r+1, r+1)%26) pr3.erase(r+1); }
- sgt.updateRange(l, r, x%26);
- if(l > 0)
- { if(sgt.gg(l-1, l-1)%26 == sgt.gg(l, l)%26) pr2.insert(l); }
- if(r+1 < n)
- { if(sgt.gg(r, r)%26 == sgt.gg(r+1, r+1)%26) pr2.insert(r+1); }
- if(l-1 > 0)
- { if(sgt.gg(l-2, l-2)%26 == sgt.gg(l, l)%26) pr3.insert(l); }
- if(l > 0 && l+1 <= r)
- { if(sgt.gg(l-1, l-1)%26 == sgt.gg(l+1, l+1)%26) pr3.insert(l+1); }
- if(r+2 < n)
- { if(sgt.gg(r, r)%26 == sgt.gg(r+2, r+2)%26) pr3.insert(r+2); }
- if(r-1 >= l && r+1 < n)
- { if(sgt.gg(r-1, r-1)%26 == sgt.gg(r+1, r+1)%26) pr3.insert(r+1); }
- }
- else
- {
- int l, r;
- cin>>l>>r;
- l--, r--;
- if(*pr2.lower_bound(l+1) <= r || *pr3.lower_bound(l+2) <= r)
- cout<<"No\n";
- else
- cout<<"Yes\n";
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement