tju3140 Switching Lights

数据加强后很经典

#include <iostream>
#include 
<ctime>
using namespace std;

#define MAXN 100001

int n, m;
int cnt[3*MAXN][2];

struct Node{
    
int l, r, sum;
}nod[
3 * MAXN];

void buildtree(int l, int r, int u){
    nod[u].l 
= l;
    nod[u].r 
= r;
    nod[u].sum 
= 0;
    
if (l == r){
        cnt[u][
0= 1;
        
return;
    }
    
else{
        buildtree(l, (l 
+ r)/22 * u);
        buildtree((l 
+ r)/2 + 1, r, 2 * u + 1);
        cnt[u][
0= cnt[2*u][0+ cnt[2*u+1][0];
    }
}

void add(int l, int r, int u, int s){
    
if (l <= nod[u].l && nod[u].r <= r){
        nod[u].sum
++;
        
return;
    }
    s 
+= nod[u].sum;
    
int v = 2 * u;
    
if (r >= nod[v + 1].l)
        add(l, r, v 
+ 1, s);
    
if (l <= nod[v].r)
        add(l, r, v, s);
    cnt[u][s 
& 1= cnt[v][(s + nod[v].sum) & 1+ cnt[v+1][(s + nod[v+1].sum) & 1];
    cnt[u][
1 - (s & 1)] = cnt[v][1 - ((s + nod[v].sum) & 1)] + cnt[v+1][1 - ((s + nod[v+1].sum) & 1)];
}

int get(int l, int r, int u, int s){
    
if (l <= nod[u].l && nod[u].r <= r)
        
return cnt[u][(nod[u].sum + s) & 1];
    s 
+= nod[u].sum;
    
int ret = 0;
    
if (l <= nod[2*u].r)
        ret 
+= get(l, r, 2*u, s);
    
if (r >= nod[2*u+1].l)
        ret 
+= get(l, r, 2*u+1, s);
    
return ret;
}




int main(){
    
int i, order, l, r;
    
//freopen("C.in", "r", stdin);
    
//freopen("C.out", "w", stdout);
    
//int t = clock();
    while (scanf("%d %d"&n, &m) != EOF){
        memset(cnt, 
0sizeof(cnt));
        buildtree(
1, n, 1);
        
for (i = 0; i < m; i++){
        scanf(
"%d %d %d"&order, &l, &r);
            
if (order == 0)
                add(l, r, 
10);
            
else
                printf(
"%d\n"get(l, r, 11));
        }
    }
    
//cout << clock() - t << endl;
    
//system("PAUSE");
    return 0;
}
posted @ 2009-03-31 21:25  Beetlebum  阅读(308)  评论(0编辑  收藏  举报