Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<stdlib.h>
- #include<malloc.h>
- #include<vector>
- #include<algorithm>
- #include<stack>
- #include<queue>
- #include<list>
- #include<string>
- #include<map>
- #define min(a,b) (a>b?b:a)
- #define max(a,b) (a>b?a:b)
- #define PB(x) push_back(x)
- #define MP(x,y) make_pair(x,y)
- #define F first
- #define S second
- using namespace std;
- typedef long long LL;
- typedef pair<int,int> PII;
- typedef vector<int> VI;
- int value[10000000]={}; //if all the elements of node are flipped or not
- int sum[10000000]={}; //no. of heads in the range of the node,not considering an entire flip of the range if any
- //final query of a node will be sum or inv(sum) dependeing on if its flipped or not
- int update(int i,int j,int p,int q,int node) //i,j is range p,q is query inp
- {
- if(p>j || q<i)
- return (value[node]?j-i+1-sum[node]:sum[node]);
- if(p<=i && q>=j){
- value[node]=1-value[node];
- return (value[node]?j-i+1-sum[node]:sum[node]);
- }
- int a=update(i,(i+j)/2,p,q,node*2+1);
- int b=update((i+j)/2+1,j,p,q,node*2+2);
- sum[node]=a+b;
- return (value[node]?j-i+1-sum[node]:sum[node]);
- }
- int query(int i,int j,int p,int q,int node,int prev)
- {
- if(p>j || q<i)
- return 0;
- if(p<=i && q>=j){
- if((prev+value[node])%2==1)
- return (j-i+1-sum[node]);
- else
- return sum[node];
- }
- prev+=value[node];
- prev%=2;
- return query(i,(i+j)/2,p,q,node*2+1,prev)+query((i+j)/2+1,j,p,q,node*2+2,prev);
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- int t,n;
- cin>>n>>t;
- while(t--){
- int o,a,b;
- cin>>o>>a>>b;
- if(o==1)
- cout<<query(0,n-1,a,b,0,0)<<endl;
- else
- update(0,n-1,a,b,0);
- /*for(int i=0;i<=18;i++){
- cout<<value[i]<<" ";
- }
- cout<<endl;
- for(int i=0;i<=18;i++){
- cout<<sum[i]<<" ";
- }
- cout<<endl;*/
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement