LITES - Bật đèn

Tác giả: hieult

Ngôn ngữ: C++


#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.000001
#define maxn 100011
#define mod 1000000000
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
#define fi first 
#define se second

double const PI=4*atan(1);
double const oo = 1e19;

using namespace std;

typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;

struct tree{
    int number, change;
    tree(){};
    tree(int _number, int _change){ number = _number, change = _change;}
};

tree empty = tree(0,0);

int n, m, u, v, chiso;
tree f[maxn * 4];

void update(int l, int r, int i){
    
    if(u > r || v < l){
        if(f[i].change) f[i].number = r - l + 1 - f[i].number;
        f[i + i].change ^= f[i].change;
        f[i + i + 1].change ^= f[i].change;
        f[i].change = 0; 
    return;
    }
    if(u <= l && v >= r){ 
        f[i].change = 1 - f[i].change;
        if(f[i].change) f[i].number = r - l + 1 - f[i].number;
        f[i + i].change ^= f[i].change;
        f[i + i + 1].change ^= f[i].change;
        f[i].change = 0;
        return;
    }
    int mid = (l + r) / 2;
    f[i + i].change ^= f[i].change;
    f[i + i + 1].change ^= f[i].change;
    f[i].change = 0;
    update(l, mid, i + i);
    update(mid + 1, r, i + i + 1);
    f[i].number = f[i + i].number + f[i + i + 1].number;
}

int get(int l, int r,int i){
    if(u > r || v < l) return 0;
    if(u <= l && v >= r){
        if(f[i].change) return r - l + 1 - f[i].number;
        return f[i].number;
    }
    int mid = (l + r) / 2;
    f[i + i].change ^= f[i].change;
    f[i + i + 1].change ^= f[i].change;
    if(f[i].change) f[i].number = r - l + 1 - f[i].number;
    f[i].change = 0;
    return get(l, mid, i + i) + get(mid + 1, r, i + i + 1);
}

int main(){
   // freopen("input.in","r",stdin); 
   // freopen("output.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i = 1; i < 4 * n; i++) {
        f[i] = empty;
    }
    //printf("%d.......\n",f[1].length);
    for(int i = 0; i < m; i++){
      //  printf("**%d\n",i);
        scanf("%d %d %d",&chiso,&u,&v);
        if(chiso == 0){ update(1, n, 1);}
        else printf("%d\n",get(1, n, 1));
    }
     // getch();
}



Download