Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<stdlib.h>
  6. #include<malloc.h>
  7. #include<vector>
  8. #include<algorithm>
  9. #include<stack>
  10. #include<queue>
  11. #include<list>
  12. #include<string>
  13. #include<map>
  14. #define min(a,b) (a>b?b:a)
  15. #define max(a,b) (a>b?a:b)
  16. #define PB(x) push_back(x)
  17. #define MP(x,y) make_pair(x,y)
  18. #define F first
  19. #define S second
  20. using namespace std;
  21. typedef long long LL;
  22. typedef pair<int,int> PII;
  23. typedef vector<int> VI;
  24.  
  25. int value[10000000]={}; //if all the elements of node are flipped or not
  26. int sum[10000000]={}; //no. of heads in the range of the node,not considering an entire flip of the range if any
  27. //final query of a node will be sum or inv(sum) dependeing on if its flipped or not
  28. int update(int i,int j,int p,int q,int node) //i,j is range p,q is query inp
  29. {
  30. if(p>j || q<i)
  31. return (value[node]?j-i+1-sum[node]:sum[node]);
  32. if(p<=i && q>=j){
  33. value[node]=1-value[node];
  34. return (value[node]?j-i+1-sum[node]:sum[node]);
  35. }
  36. int a=update(i,(i+j)/2,p,q,node*2+1);
  37. int b=update((i+j)/2+1,j,p,q,node*2+2);
  38. sum[node]=a+b;
  39. return (value[node]?j-i+1-sum[node]:sum[node]);
  40. }
  41. int query(int i,int j,int p,int q,int node,int prev)
  42. {
  43. if(p>j || q<i)
  44. return 0;
  45. if(p<=i && q>=j){
  46. if((prev+value[node])%2==1)
  47. return (j-i+1-sum[node]);
  48. else
  49. return sum[node];
  50. }
  51. prev+=value[node];
  52. prev%=2;
  53. return query(i,(i+j)/2,p,q,node*2+1,prev)+query((i+j)/2+1,j,p,q,node*2+2,prev);
  54. }
  55.  
  56. int main()
  57. {
  58. freopen("input.txt","r",stdin);
  59. int t,n;
  60. cin>>n>>t;
  61. while(t--){
  62. int o,a,b;
  63. cin>>o>>a>>b;
  64. if(o==1)
  65. cout<<query(0,n-1,a,b,0,0)<<endl;
  66. else
  67. update(0,n-1,a,b,0);
  68. /*for(int i=0;i<=18;i++){
  69. cout<<value[i]<<" ";
  70. }
  71. cout<<endl;
  72. for(int i=0;i<=18;i++){
  73. cout<<sum[i]<<" ";
  74. }
  75. cout<<endl;*/
  76. }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement