10pts求调
查看原帖
10pts求调
1055698
inkfox_exe楼主2024/11/21 19:19
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[101000],op,l,r;
struct node{
	ll l,r,sum,add;
}t[401000];
void build(ll p,ll l,ll r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].sum=0;
		return;
	}
	ll mid=(t[p].l+t[p].r)/2;
	build(p*2,l,mid);build(p*2+1,mid+1,r);
}
void down(ll p){
	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;
	if(t[p*2].add==0) t[p*2].add=1;	
	else t[p*2].add=0;
	if(t[p*2+1].add==0) t[p*2+1].add=1;
	else t[p*2+1].add=0;
	t[p].add=0;
}
void update(ll p,ll l,ll r){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].sum=t[p].r-t[p].l+1-t[p].sum;
		if(t[p].add==0){
			t[p].add=1;
		}
		else{
			t[p].add=0;
		}
		return;
	}
	down(p);
	ll mid=(t[p].l+t[p].r)/2;
	if(l<=mid)update(p*2,l,r);
	if(r>mid)update(p*2+1,l,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
ll ask(ll p,ll l,ll r){
	if(t[p].l>=l&&t[p].r<=r)return t[p].sum;
	down(p);
	ll ans=0;
	ll mid=(t[p].l+t[p].r)/2;
	if(l<=mid)ans+=ask(p*2,l,r);
	if(r>mid)ans+=ask(p*2+1,l,r);
	return ans;
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);  
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>op>>l>>r;
		if(op==0){
			update(1,l,r);
		}
		else{
			cout<<ask(1,l,r)<<'\n';
		}
	}
	return 0;
}


2024/11/21 19:19
加载中...