Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <queue>
- #include <utility>
- #include <algorithm>
- using namespace std;
- #define INF 1<<29
- #define SET(a,v) memset(a,v,sizeof(a))
- int M[524290];
- int M1[524290];
- int L[524290];
- int N,Q;
- void init(int b,int e,int i)
- {
- if(b==e)M[i]=1;
- else
- {
- int mid=(b+e)/2;
- init(b,mid,2*i);
- init(mid+1,e,2*i+1);
- M[i]=M[2*i]+M[2*i+1];
- }
- }
- void update(int b,int e,int l,int r,int i)
- {
- if(e<l || r<b)return;
- if(b>=l && e<=r)
- {
- //M[i]=M[2*i]+M[2*i+1];
- //M1[i]=M1[2*i]+M1[2*i+1];
- L[i]+=1;
- L[i]%=3;
- if(L[i]==1)
- {
- int x=(e-b+1)-M[i]-M1[i];
- M1[i]=M[i];
- M[i]=x;
- }
- else if(L[i]==2)
- {
- int x=(e-b+1)-M[i]-M1[i];
- M[i]=M1[i];
- M1[i]=x;
- }
- return;
- }
- int mid=(b+e)/2;
- update(b,mid,l,e,2*i);
- update(mid+1,e,l,r,2*i+1);
- M[i]=M[2*i]+M[2*i+1];
- M1[i]=M1[2*i]+M1[2*i+1];
- if(L[i]==1)
- {
- int x=(e-b+1)-M[i]-M1[i];
- M1[i]=M[i];
- M[i]=x;
- }
- else if(L[i]==2)
- {
- int x=(e-b+1)-M[i]-M1[i];
- M[i]=M1[i];
- M1[i]=x;
- }
- }
- struct node
- {
- int p0;
- int p1;
- };
- node query(int b,int e,int l,int r,int i)
- {
- node Q,R;R.p0=-1;
- if(e<l || r<b)return R;
- if(l<=b && e<=r)
- {
- Q.p0=M[i];
- Q.p1=M1[i];
- return Q;
- }
- int mid=(b+e)/2;
- Q=query(b,mid,l,e,2*i);
- R=query(mid+1,e,l,r,2*i+1);
- if(L[i]==1)
- {
- if(Q.p0!=-1)
- {
- int x=(l-b+1)-Q.p0-Q.p1;
- Q.p1=Q.p0;
- Q.p0=x;
- }
- if(R.p0!=-1)
- {
- int x=(e-r+1)-R.p0-R.p1;
- R.p1=R.p0;
- R.p0=x;
- }
- }
- else if(L[i]==2)
- {
- if(Q.p0!=-1)
- {
- int x=(l-b+1)-Q.p0-Q.p1;
- Q.p0=Q.p1;
- Q.p1=x;
- }
- if(R.p0!=-1)
- {
- int x=(e-r+1)-R.p0-R.p1;
- R.p0=R.p1;
- R.p1=x;
- }
- }
- if(R.p0==-1)return Q;
- else if(Q.p0==-1)return R;
- //return p1+p2;
- R.p0+=Q.p0;
- R.p1+=Q.p1;
- return R;
- }
- int main()
- {
- freopen("fa.in","r",stdin);
- int T,i,j,R,B,cas=0;
- scanf("%d",&T);
- while(T--)
- {
- SET(L,0);
- SET(M1,0);
- scanf("%d%d",&N,&Q);
- int cmd,l,r;
- node ans;
- init(0,N-1,1);
- printf("Case %d:\n",++cas);
- for(i=0;i<Q;i++)
- {
- scanf("%d%d%d",&cmd,&l,&r);
- if(cmd==0)
- {
- update(0,N-1,l,r,1);
- }
- else ans=query(0,N-1,l,r,1),cout<<ans.p0<<endl;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement