只过第二个点求条
查看原帖
只过第二个点求条
1236701
dtbigwaves楼主2024/11/4 19:21
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long n,m;
struct SegmentTree{
	long long l,r,sum,rev;
}t[N*4];
void build(long long p,long long l,long long r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].sum=0;
		return;
	}
	long long mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}
void spread(long long p){
	if(t[p].rev){
		t[p*2].sum=t[p*2].r-t[p*2].l+1-t[p*2].sum;
		t[p*2+1].sum=t[p*2+1].r-t[p*2+1].l+1-t[p*2+1].sum;
		t[p*2].rev=~t[p*2].rev;
		t[p*2+1].rev=~t[p*2+1].rev;
		t[p].rev=0;
	}
}
void change(long long p,long long l,long long r){
	if(l<=t[p].l && r>=t[p].r){
		t[p].sum=t[p].r-t[p].l+1-t[p].sum;
		t[p].rev=~t[p].rev;;
		return;
	}
	spread(p);
	long long mid=(t[p].l+t[p].r)/2;
	if(l<=mid) change(p*2,l,mid);
	if(r>mid) change(p*2+1,mid+1,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
long long ask(long long p,long long l,long long r){
	if(l<=t[p].l && r>=t[p].r) return t[p].sum;
	spread(p);
	long long mid=(t[p].l+t[p].r)/2;
	long long val=0;
	if(l<=mid) val+=ask(p*2,l,r);
	if(r>mid) val+=ask(p*2+1,l,r);
	return val;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	build(1,1,n);
	for(long long i=1;i<=m;i++){
		long long c,a,b;
		cin>>c>>a>>b;
		if(c==0) change(1,a,b);
		if(c==1) cout<<ask(1,a,b)<<'\n';
	}
	return 0;
}
2024/11/4 19:21
加载中...