10pts求调,呜呜
查看原帖
10pts求调,呜呜
778886
brucelei658楼主2023/12/6 17:08
#include<bits/stdc++.h>
using namespace std;
#define f(i,a,b) for(int i = a;i<=b;i++)
#define f_(i,a,b) for(int i = a;i>=b;i--)
typedef long long ll;
typedef unsigned long long ull;
const int N =1e5+10;
int sum[N*4],add[N*4];
int n,q,c,a,b;
void pushup(int k){
	sum[k] = sum[k<<1|1] + sum[k<<1];
}
void pushdown(int k,int l,int r){
//	cout<<3;
	if(add[k] == 0)return ;
	add[k<<1]^=1;
	add[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];
	//子树的懒标记也变换 
	
	add[k] = 0;
}
void update(int k,int l,int r,int x,int y){
//	cout<<2;
	if(x<=l && y >= r){
		//开的变关,相当于取反 
		sum[k] = (r-l+1) - sum[k];
		add[k]^=1;
		return ;
	}
	pushdown(k,1,r);
	int mid = l+r>>1;
	if(x<=mid)update(k<<1,l,mid,x,y);
	if(y>= mid+1)update(k<<1|1,mid+1,r,x,y);
	pushup(k);
}
int query(int k,int l,int r,int x,int y){
//	cout<<1;
	if(x<=l && y>=r){
		return sum[k];
	}
	pushdown(k,l,r);
	int a = 0,b = 0,mid = l+r>>1;
	if(x<=mid)a = query(k<<1,l,mid,x,y);
	if(y>=mid+1)b = query(k<<1|1,mid+1,r,x,y);
	return a+b;
}
int main(){
	cin>>n>>q;
	while(q--){
		scanf("%d%d%d",&c,&a,&b);
		if(c == 0){
			update(1,1,n,a,b);
		}else{
			printf("%d\n",query(1,1,n,a,b));
		}
	}




	return 0;
}

2023/12/6 17:08
加载中...