10pt求调,线段树
查看原帖
10pt求调,线段树
816076
o9233楼主2024/5/25 15:32
#include<bits/stdc++.h>
using namespace std;

int n,m;
long long lt[200002];
bool lz[200002];

void update(int id){
	lt[id]=lt[id*2]+lt[id*2+1];
}

void down(long long l,long long r,long long mid,int id){
	if(lz[id]){
		lt[id*2]=mid-l+1-lt[id*2];
		lt[id*2+1]=r-mid-lt[id*2+1];
		lz[id*2]^=1;
		lz[id*2+1]^=1;
		lz[id]=0;
	}
}

void change(long long l,long long r,long long x,long long y,int id){
	if(l>=x and r<=y){
		lt[id]=r-l+1-lt[id];
		lz[id]^=1;
		return ;
	}
	long long mid=(l+r)/2;
	down(l,r,mid,id);
	if(x<=mid){
		change(l,mid,x,y,id*2);
	}
	if(mid>y){
		change(mid+1,r,x,y,id*2+1);
	}
	update(id);
}

int fund(long long l,long long r,long long x,long long y,int id){
	if(l>=x and r<=y){
		return lt[id];
	}
	long long ans=0;
	long long mid=(l+r)/2;
	down(l,r,mid,id);
	if(mid>=x){
		ans+=fund(l,mid,x,y,id*2);
	}
	if(mid<y){
		ans+=fund(mid+1,r,x,y,id*2+1);
	}
	return ans;
}

int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		long long a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		if(a){
			printf("%lld\n",fund(1,n,b,c,1));
		}
		else{
			change(1,n,b,c,1);
		}
	}
	
	return 0;
}
2024/5/25 15:32
加载中...