P2846 [USACO08NOV] Light Switching G.cpp

#include<bits/stdc++.h>
#define int int_fast64_t
#define lc p<<1
#define rc p<<1|1
using namespace std;
struct node{
	int l,r,sum,add;
}tr[int(8e5+5)];
void pushup(int p){
	tr[p].sum=tr[lc].sum+tr[rc].sum;
}
void build(int p,int l,int r){
	tr[p]={l,r,0,0};
	if(l==r)return;
	int mid=l+r>>1;
	build(lc,l,mid),build(rc,mid+1,r);
}
void pushdown(int p){
	if(tr[p].add){
		tr[lc].add^=1;
		tr[rc].add^=1;
		int mid=tr[p].l+tr[p].r>>1;
		tr[lc].sum=(mid-tr[p].l+1)-tr[lc].sum;
		tr[rc].sum=(tr[p].r-mid)-tr[rc].sum;
		tr[p].add=0;
	}
}
void update(int p,int l,int r){
	if(tr[p].r<l||tr[p].l>r)return;
	if(l<=tr[p].l&&tr[p].r<=r){
		tr[p].sum=(tr[p].r-tr[p].l+1)-tr[p].sum;
		tr[p].add^=1;
		return;
	}
	pushdown(p);
	update(lc,l,r),update(rc,l,r);
	pushup(p);
}
int query(int p,int l,int r){
	if(tr[p].r<l||tr[p].l>r)return 0;
	if(l<=tr[p].l&&tr[p].r<=r)return tr[p].sum;
	pushdown(p);
	return query(lc,l,r)+query(rc,l,r);
}
int32_t main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	int n,m;
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		bool op;
		int l,r;
		cin>>op>>l>>r;
		if(!op){
			update(1,l,r);
		}else{
			cout<<query(1,l,r)<<'\n';
		}
	}	
	return 0;
}

 

posted @ 2026-08-20 20:56  longyitongxue  阅读(2)  评论(0)    收藏  举报
longint's blog

2025-2026, © longint's blog