fork download
  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. using namespace std;
  5. int tree[1001000],lazy[1001000],a[100100];
  6. bool mark[1000100];
  7. void initialize(int node,int b,int e)
  8. {
  9. if(b==e)
  10. {
  11. if(mark[a[e]]==false)
  12. {
  13. tree[node]=1;
  14. }
  15. else
  16. {
  17. tree[node]=0;
  18. }
  19.  
  20. }
  21. else
  22. {
  23. initialize(2*node,b,(b+e)/2);
  24. initialize(2*node+1,((b+e)/2)+1,e);
  25. tree[node]=(tree[node*2]+tree[node*2+1]);
  26. }
  27. }
  28. int query(int node,int b,int e,int i,int j)
  29. {
  30. if(lazy[node]!=0)
  31. {
  32. if(mark[lazy[node]]==false)
  33. {
  34. tree[node]=(e-b+1);
  35. }
  36. else
  37. {
  38. tree[node]=0;
  39. }
  40. if(b!=e)
  41. {
  42.  
  43.  
  44. lazy[2*node]=lazy[node];
  45. lazy[node*2+1]=lazy[node];
  46. }
  47. lazy[node]=0;
  48. }
  49. if(b>j||e<i)
  50. {
  51. return -10;
  52. }
  53. else if(b>=i&&e<=j)
  54. {
  55. return tree[node];
  56. }
  57. else
  58. {
  59. int p1=query(node*2,b,(b+e)/2,i,j);
  60. int p2=query(2*node+1,((b+e)/2)+1,e,i,j);
  61.  
  62. if(p1==-10)
  63. {
  64. return p2;
  65. }
  66. else if(p2==-10)
  67. {
  68. return p1;
  69. }
  70. else
  71. {
  72. return p1+p2;
  73. }
  74.  
  75. }
  76. }
  77. void update(int node,int b,int e,int i,int j,int v)
  78. {
  79. if(lazy[node]!=0)
  80. {
  81. if(mark[lazy[node]]==false)
  82. {
  83. tree[node]=e-b+1;
  84. }
  85. else
  86. {
  87. tree[node]=0;
  88. }
  89. if(b!=e)
  90. {
  91.  
  92.  
  93. lazy[2*node]=lazy[node];
  94. lazy[2*node+1]=lazy[node];
  95.  
  96. }
  97. lazy[node]=0;
  98. }
  99. if(b>j||e<i)
  100. {
  101. return;
  102. }
  103. else if(b>=i&&e<=j)
  104. {
  105. if(mark[v]==false)
  106. {
  107. tree[node]=e-b+1;
  108. }
  109. else
  110. {
  111. tree[node]=0;
  112. }
  113. if(b!=e)
  114. {
  115.  
  116.  
  117. lazy[node*2]=v;
  118. lazy[2*node+1]=v;
  119. }
  120. return;
  121. }
  122. else
  123. {
  124. update(node*2,b,(b+e)/2,i,j,v);
  125. update(2*node+1,((b+e)/2)+1,e,i,j,v);
  126. tree[node]=(tree[node*2]+tree[node*2+1]);
  127. }
  128. }
  129. void sieve(int n)
  130. {
  131. for(int i=3;i<1010;i=i+2)
  132. {
  133. if(mark[i]==false)
  134. {
  135. for(int j=i;j*i<n;++j)
  136. {
  137. if(mark[j*i]==false)
  138. {
  139. mark[i*j]=true;
  140.  
  141. }
  142. }
  143. }
  144. }
  145. }
  146.  
  147. int main()
  148. {
  149. int t;
  150.  
  151. scanf("%d",&t);
  152. mark[0]=true;
  153. mark[1]=true;
  154. for(int i=4;i<1000100;i=i+2)
  155. {
  156. mark[i]=true;
  157. }
  158. sieve(1000100);
  159. for(int i=1;i<=t;++i)
  160. {
  161.  
  162.  
  163. int n,q;
  164.  
  165. scanf("%d%d",&n,&q);
  166. printf("Case %d:\n", i);
  167.  
  168. for(int i=0;i<n;++i)
  169. {
  170.  
  171. scanf("%d",&a[i]);
  172. }
  173.  
  174.  
  175.  
  176.  
  177. initialize(1,0,n-1);
  178.  
  179.  
  180.  
  181. while(q>0)
  182. {
  183. q--;
  184. int ch,x,y,v;
  185.  
  186. scanf("%d%d%d",&ch,&x,&y);
  187. if(ch==0)
  188. {
  189.  
  190. scanf("%d",&v);
  191. update(1,0,n-1,x-1,y-1,v);
  192.  
  193. }
  194. else
  195. {
  196. printf("%d\n",query(1,0,n-1,x-1,y-1));
  197.  
  198. }
  199. }
  200.  
  201. }
  202. }
  203.  
Runtime error #stdin #stdout 0.01s 19984KB
stdin
Standard input is empty
stdout
Standard output is empty