fork download
  1. #include<bits/stdc++.h>
  2. #define MAX 400000
  3. using namespace std;
  4.  
  5. struct node
  6. {
  7. int rem1,rem2,data;
  8. }tree[MAX];
  9.  
  10. int swap(int &a,int &b){ a = a+b; b = a-b; a = a-b;}
  11.  
  12. void init(int i,int start,int end)
  13. {
  14. if(start==end)
  15. {
  16. tree[i].data =1;
  17. tree[i].rem1 =0;
  18. tree[i].rem2 =0;
  19. return;
  20. }
  21.  
  22. int mid = (start+end)/2;
  23. init(2*i,start,mid);
  24. init(2*i+1,mid+1,end);
  25.  
  26. tree[i].data = tree[2*i].data + tree[2*i+1].data;
  27. tree[i].rem1 = 0;
  28. tree[i].rem2 = 0;
  29. }
  30.  
  31. void update(int i,int start,int end,int qs,int qe)
  32. {
  33. if(qs>end||qe<start)
  34. return;
  35.  
  36. if(qs<=start&&qe>=end)
  37. {
  38. swap(tree[i].data,tree[i].rem1);
  39. swap(tree[i].data,tree[i].rem2);
  40. return;
  41. }
  42. int mid = (start+end)/2;
  43. update(2*i,start,mid,qs,qe);
  44. update(2*i+1,mid+1,end,qs,qe);
  45.  
  46. tree[i].data = tree[2*i].data + tree[2*i+1].data;
  47. tree[i].rem1 = tree[2*i].rem1 + tree[2*i+1].rem1;
  48. tree[i].rem2 = tree[2*i].rem2 + tree[2*i+1].rem2;
  49. }
  50.  
  51. int query(int i,int start,int end,int qs,int qe)
  52. {
  53. if(qs>end||qe<start)
  54. return 0;
  55. if(qs<=start&&qe>=end)
  56. return tree[i].data;
  57.  
  58. int mid = (start+end)/2;
  59. return query(2*i,start,mid,qs,qe) + query(2*i+1,mid+1,end,qs,qe);
  60. }
  61.  
  62. int main()
  63. {
  64. int n,q,type,a,b;
  65. scanf("%d%d",&n,&q);
  66. init(1,0,n-1);
  67.  
  68. while(q--)
  69. {
  70. scanf("%d%d%d",&type,&a,&b);
  71. if(type==0)
  72. update(1,0,n-1,a,b);
  73. else
  74. printf("%d\n",query(1,0,n-1,a,b));
  75.  
  76. }
  77.  
  78. return 0;
  79. }
  80.  
Success #stdin #stdout 0s 7372KB
stdin
4 2
0 2 3
1 2 2
stdout
1