fork(1) download
  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5. static int coins[400000];
  6. int query(int node,int a,int b,int start,int dest)
  7. {
  8. int res(0);
  9. if (start>dest||start>b||dest<a)return res;
  10. else if (start==dest)return coins[node];
  11. else
  12. {
  13. int a1=query(node*2,a,b,start,max(dest/2,start));
  14. int a2=query(node*2+1,a,b,max(dest/2,start)+1,dest);
  15. res=a1+a2;
  16. return res;
  17. }
  18. }
  19. void flip (int node,int a,int b,int start,int dest)
  20. {
  21. if (start>dest||start>b||dest<a)return ;
  22. else if (start==dest)coins[node]=(coins[node]+1)%2;
  23. else {
  24. flip(node*2,a,b,start,max(dest/2,start));
  25. flip(node*2+1,a,b,max(dest/2,start)+1,dest);
  26. coins[node]=coins[node*2]+coins[node*2+1];}
  27. }
  28. int main()
  29. {
  30. int n,q;
  31. scanf("%d%d",&n,&q);
  32. for (int c(0);c<q;c++)
  33. {
  34. int flag,a,b;
  35. scanf("%d%d%d",&flag,&a,&b);
  36.  
  37. if (flag==0)flip(1,a+1,b+1,1,n);
  38. else cout << query(1,a+1,b+1,1,n) << endl;
  39.  
  40. }
  41. return 0;
  42. }
  43.  
Success #stdin #stdout 0s 4860KB
stdin
4 7
1 0 3
0 1 2
1 0 1
1 0 0
0 0 3
1 0 3 
1 3 3
stdout
0
1
0
2
1