现在的位置: 首页 > 综合 > 正文

1230: [Usaco2008 Nov]lites 开关灯

2018年04月24日 ⁄ 综合 ⁄ 共 985字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,sum[400001];
bool rever[400001];
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x*=10;x+=ch-'0';ch=getchar();}
    return x*f;
}
void pushdown(int k,int l,int r){
	if(rever[k]){
		rever[k<<1]^=1;
		rever[k<<1|1]^=1;
		int mid=(l+r)>>1;
		sum[k<<1]=mid-l+1-sum[k<<1];
		sum[k<<1|1]=r-mid-sum[k<<1|1];
		rever[k]=0;
	}
}
void pushup(int k){
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
void rev(int k,int L,int R,int l,int r){
	if(L<=l&&R>=r){
		rever[k]^=1;
		sum[k]=r-l+1-sum[k];
		return;
	}
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	if(L<=mid)rev(k<<1,L,R,l,mid);
	if(R>mid)rev(k<<1|1,L,R,mid+1,r);
	pushup(k);
}
int ask(int k,int L,int R,int l,int r){
	if(L<=l&&R>=r)return sum[k];
	pushdown(k,l,r);
	int ret=0,mid=(l+r)>>1;
	if(L<=mid)ret+=ask(k<<1,L,R,l,mid);
	if(R>mid)ret+=ask(k<<1|1,L,R,mid+1,r);
	return ret;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int a=read(),b=read(),c=read();
		if(a==0)rev(1,b,c,1,n);
		if(a==1)printf("%d\n",ask(1,b,c,1,n));
	}
	return 0;
}

抱歉!评论已关闭.