Advertisement
farsid

Untitled

Apr 15th, 2013
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <queue>
  9. #include <utility>
  10. #include <algorithm>
  11. using namespace std;
  12. #define INF 1<<29
  13. #define SET(a,v) memset(a,v,sizeof(a))
  14.  
  15. int M[524290];
  16. int M1[524290];
  17. int L[524290];
  18. int N,Q;
  19.  
  20. void init(int b,int e,int i)
  21. {
  22.  
  23. if(b==e)M[i]=1;
  24. else
  25. {
  26. int mid=(b+e)/2;
  27. init(b,mid,2*i);
  28. init(mid+1,e,2*i+1);
  29.  
  30. M[i]=M[2*i]+M[2*i+1];
  31. }
  32.  
  33. }
  34.  
  35. void update(int b,int e,int l,int r,int i)
  36. {
  37. if(e<l || r<b)return;
  38. if(b>=l && e<=r)
  39. {
  40. //M[i]=M[2*i]+M[2*i+1];
  41. //M1[i]=M1[2*i]+M1[2*i+1];
  42. L[i]+=1;
  43. L[i]%=3;
  44. if(L[i]==1)
  45. {
  46. int x=(e-b+1)-M[i]-M1[i];
  47. M1[i]=M[i];
  48. M[i]=x;
  49.  
  50. }
  51. else if(L[i]==2)
  52. {
  53. int x=(e-b+1)-M[i]-M1[i];
  54. M[i]=M1[i];
  55. M1[i]=x;
  56.  
  57. }
  58. return;
  59. }
  60. int mid=(b+e)/2;
  61. update(b,mid,l,e,2*i);
  62. update(mid+1,e,l,r,2*i+1);
  63.  
  64. M[i]=M[2*i]+M[2*i+1];
  65. M1[i]=M1[2*i]+M1[2*i+1];
  66.  
  67. if(L[i]==1)
  68. {
  69. int x=(e-b+1)-M[i]-M1[i];
  70. M1[i]=M[i];
  71. M[i]=x;
  72.  
  73. }
  74. else if(L[i]==2)
  75. {
  76. int x=(e-b+1)-M[i]-M1[i];
  77. M[i]=M1[i];
  78. M1[i]=x;
  79.  
  80. }
  81.  
  82. }
  83.  
  84. struct node
  85. {
  86. int p0;
  87. int p1;
  88. };
  89.  
  90. node query(int b,int e,int l,int r,int i)
  91. {
  92. node Q,R;R.p0=-1;
  93. if(e<l || r<b)return R;
  94. if(l<=b && e<=r)
  95. {
  96. Q.p0=M[i];
  97. Q.p1=M1[i];
  98. return Q;
  99. }
  100.  
  101.  
  102.  
  103. int mid=(b+e)/2;
  104. Q=query(b,mid,l,e,2*i);
  105. R=query(mid+1,e,l,r,2*i+1);
  106.  
  107. if(L[i]==1)
  108. {
  109. if(Q.p0!=-1)
  110. {
  111. int x=(l-b+1)-Q.p0-Q.p1;
  112. Q.p1=Q.p0;
  113. Q.p0=x;
  114. }
  115. if(R.p0!=-1)
  116. {
  117. int x=(e-r+1)-R.p0-R.p1;
  118. R.p1=R.p0;
  119. R.p0=x;
  120. }
  121.  
  122. }
  123. else if(L[i]==2)
  124. {
  125. if(Q.p0!=-1)
  126. {
  127. int x=(l-b+1)-Q.p0-Q.p1;
  128. Q.p0=Q.p1;
  129. Q.p1=x;
  130. }
  131. if(R.p0!=-1)
  132. {
  133. int x=(e-r+1)-R.p0-R.p1;
  134. R.p0=R.p1;
  135. R.p1=x;
  136. }
  137. }
  138.  
  139.  
  140. if(R.p0==-1)return Q;
  141. else if(Q.p0==-1)return R;
  142. //return p1+p2;
  143. R.p0+=Q.p0;
  144. R.p1+=Q.p1;
  145. return R;
  146.  
  147. }
  148.  
  149. int main()
  150. {
  151.  
  152.  
  153. freopen("fa.in","r",stdin);
  154. int T,i,j,R,B,cas=0;
  155. scanf("%d",&T);
  156.  
  157. while(T--)
  158. {
  159. SET(L,0);
  160. SET(M1,0);
  161. scanf("%d%d",&N,&Q);
  162. int cmd,l,r;
  163. node ans;
  164. init(0,N-1,1);
  165. printf("Case %d:\n",++cas);
  166. for(i=0;i<Q;i++)
  167. {
  168. scanf("%d%d%d",&cmd,&l,&r);
  169. if(cmd==0)
  170. {
  171. update(0,N-1,l,r,1);
  172. }
  173. else ans=query(0,N-1,l,r,1),cout<<ans.p0<<endl;
  174. }
  175. }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement