Advertisement
Saleh127

Spoj Light Switching

Aug 9th, 2021
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define test int t; cin>>t; for(int cs=1;cs<=t;cs++)
  5. ll a[200005];
  6. ll tree[600005];
  7. ll lazy[600005];
  8.  
  9. void push_down(ll node,ll b,ll e)
  10. {
  11. if(lazy[node])
  12. {
  13. if(b!=e)
  14. {
  15. lazy[node*2]=!lazy[node*2];
  16. lazy[node*2 + 1]=!lazy[node*2 +1];
  17. }
  18. tree[node]=(e-b+1)-tree[node];
  19. lazy[node]=0;
  20. }
  21. }
  22.  
  23. void update(ll node,ll b,ll e,ll i,ll j)
  24. {
  25. push_down(node,b,e);
  26. if(i>e || j<b) return;
  27. if(b>=i && e<=j)
  28. {
  29. lazy[node]=!lazy[node];
  30. push_down(node,b,e);
  31. return;
  32. }
  33. ll left = node*2;
  34. ll right = node*2 + 1ll;
  35. ll mid=(b+e)/2;
  36. update(left,b,mid,i,j);
  37. update(right,mid+1,e,i,j);
  38. tree[node]=(tree[left]+tree[right]);
  39. }
  40.  
  41. ll queries(ll node,ll b,ll e,ll i,ll j)
  42. {
  43. push_down(node,b,e);
  44. if(i>e || j<b) return 0;
  45. if(b>=i && e<=j) return tree[node];
  46. ll left = node*2;
  47. ll right = node*2 + 1ll;
  48. ll mid=(b+e)/2;
  49. ll x=queries(left,b,mid,i,j);
  50. ll y=queries(right,mid+1,e,i,j);
  51. return (x+y);
  52. }
  53.  
  54. int main()
  55. {
  56. ios_base::sync_with_stdio(0);
  57. cin.tie(0);
  58. cout.tie(0);
  59.  
  60.  
  61. ll q,n,m,i,j,k,l;
  62. char c;
  63.  
  64. scanf("%lld %lld",&n,&m);
  65.  
  66. while(m--)
  67. {
  68. scanf("%lld %lld %lld",&j,&k,&l);
  69.  
  70.  
  71. if(j)
  72. {
  73. cout<<queries(1,1,n,k,l)<<endl;
  74. }
  75. else
  76. {
  77. update(1,1,n,k,l);
  78. }
  79. }
  80.  
  81.  
  82. return 0;
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement