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;
}
本文来自博客园,作者:longyitongxue,转载请注明原文链接:https://www.cnblogs.com/Lytx-Luogu1145420/p/22601749/P2846_cpp

浙公网安备 33010602011771号