线段树求调
查看原帖
线段树求调
1173109
OrientDragon楼主2024/12/14 14:52
#include<bits/stdc++.h>
using namespace std;

const int N=100005;

int n,q,m,opt,x,y,a[N];

struct SegTree{
	int l,r,sum;
	bool lazy;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define lazy(x) tree[x].lazy
	SegTree(){l=r=sum=lazy=0;}
}tree[N<<2];

void build(int x,int l,int r){
	if(l>r)return;
	if(l==r){
		l(x)=r(x)=l;
		return;
	}
	int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	l(x)=l,r(x)=r;
}

void modify(int x,int askl,int askr){
	int l=l(x),r=r(x);
	if(l>r)return;
	if(l==r){
		sum(x)^=1;
		return;
	}
	if(askl<=l&&r<=askr){
		lazy(x)^=1;
		sum(x)=r-l+1-sum(x);
		return;
	}
	int mid=l+r>>1;
	if(askl<=mid)modify(x<<1,askl,askr);
	if(askr>mid)modify(x<<1|1,askl,askr);
	sum(x)=sum(x<<1)+sum(x<<1|1); 
}

void pushdown(int x){
	lazy(x<<1)^=1;
	lazy(x<<1|1)^=1;
	sum(x<<1)=r(x<<1)-l(x<<1)+1-sum(x<<1);
	sum(x<<1|1)=r(x<<1|1)-l(x<<1|1)+1-sum(x<<1|1); 
}

int ask(int x,int askl,int askr){
	int l=l(x),r=r(x);
	if(lazy(x))pushdown(x);
	if(askl<=l&&r<=askr)return sum(x);
	int mid=l+r>>1,ret=0;
	if(askl<=mid)ret+=ask(x<<1,askl,askr);
	if(askr>mid)ret+=ask(x<<1|1,askl,askr);
	return ret;
}

int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		cin>>opt>>x>>y;
		if(!opt)modify(1,x,y);
		else cout<<ask(1,x,y)<<endl;
	}
}
2024/12/14 14:52
加载中...