Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <numeric>
- #include <fstream>
- #include <map>
- #include <algorithm>
- #include <bitset>
- #include <set>
- #include <vector>
- #include <utility>
- #include <cstring>
- #include <string>
- #include <cctype>
- #include <cmath>
- #include <climits>
- using namespace std;
- typedef vector<int> vi;
- typedef vector< vi > vvi;
- typedef pair<int,int> pi;
- typedef vector< pi > vpi;
- typedef vector< vpi > vvpi;
- #define rep(i,a,b) for(i = a;i<=b;i++)
- #define all(c) (c).begin(),(c).end()
- #define present(c,x) (c).find(x)!=(c).end()
- #define gpresent(c,x) find(all(c),x)
- #define tr(c,it) for( typeof( (c).begin()) it = (c).begin();it!=(c).end();it++ )
- #define accu(c) accumulate(all(c),0)
- #define scalar(c1,c2) inner_product(all(c1),(c2).begin(),0)
- #define maxel(c) max_element(all(c))
- #define minel(c) min_element(all(c))
- #define fx first
- #define sx second
- #define pb(a) push_back(a)
- #define mp(a,b) make_pair(a,b)
- #define inf -300010
- ifstream in("input.in",ios::in);
- ofstream out("output.out",ios::out);
- /////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////START/////////////////////////////////////////////////////
- int flag[10000000];
- int memo[10000000];
- int update(int nd,int b,int e,int i,int j){
- if(e<i||b>j||e<b)
- return 0;
- if(b>=i&&e<=j){
- if(flag[nd]==1){
- flag[nd] = 0;
- flag[2*nd+1] = (flag[2*nd+1]+1)%2;
- flag[2*nd+2] = (flag[2*nd+2]+1)%2;
- return 2*memo[nd] - (e-b+1);
- }
- memo[nd] = (e-b+1)-memo[nd];
- flag[2*nd+1] = (flag[2*nd+1]+1)%2;
- flag[2*nd+2] = (flag[2*nd+2]+1)%2;
- return 2*memo[nd] - (e-b+1);
- }
- if(flag[nd]==1){
- flag[nd] = 0;
- flag[2*nd+1] = (flag[2*nd+1]+1)%2;
- flag[2*nd+2] = (flag[2*nd+2]+1)%2;
- memo[nd] = (e-b+1)-memo[nd];
- }
- int p1 = update(2*nd+1,b,(b+e)/2,i,j);
- int p2 = update(2*nd+2,(b+e)/2+1,e,i,j);
- memo[nd]+=p1+p2;
- return p1+p2;
- }
- int query(int nd,int b,int e,int i,int j){
- if(e<i||b>j||e<b)
- return -1;
- if(b>=i&&e<=j){
- if(flag[nd]==1){
- return (e-b+1)-memo[nd];
- }
- return memo[nd];
- }
- if(flag[nd]==1){
- flag[nd] = 0;
- flag[2*nd+1] = (flag[2*nd+1]+1)%2;
- flag[2*nd+2] = (flag[2*nd+2]+1)%2;;
- memo[nd] = (e-b+1) - memo[nd];
- }
- int p1 = query(2*nd+1,b,(b+e)/2,i,j);
- int p2 = query(2*nd+2,(b+e)/2+1,e,i,j);
- int sum = 0;
- if(p1!=-1)
- sum+=p1;
- if(p2!=-1)
- sum+=p2;
- return sum;
- }
- int main(){
- int n,q,i,a,b,t;
- cin>>n>>q;
- rep(i,1,q){
- cin>>t>>a>>b;
- if(t==0){
- update(0,0,n-1,a,b);
- }
- else
- cout<<query(0,0,n-1,a,b)<<"\n";
- }
- return 0;
- }
- /*TEST ON WHICH IT IS GIVING WRONG:-
- 6 11 ans test
- 1 0 5 0 correct
- 0 0 3
- 1 0 3 4 correct
- 1 0 1 2 correct
- 0 1 2
- 1 0 3 2 correct
- 0 0 5
- 1 0 5 4 correct
- 0 2 5
- 1 1 1 1 correct
- 1 3 3 0 wrong(correct answer is 1)
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement