80pts线段树板子求调
查看原帖
80pts线段树板子求调
65905
肖泽源楼主2024/11/29 15:31
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0;char c;
	while((c=getchar())>='0' && c<='9')
		x=x*10+c-48;
	return x;	
}
int n,m;
const int N=1e5+10;
int la[4*N],sum[4*N];
void build(int k,int l,int r)
{
	if(l==r)
	{
		sum[k]=0;
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[k<<1|1];
	return ;
}
void lazy(int k,int l,int r,int v)
{
	la[k]^=v;
	sum[k]=r-l+1-sum[k];
	return ;
}
void pushdown(int k,int l,int r)
{
	if(!la[k])return ;
	int mid=l+r>>1;
	lazy(k<<1,l,mid,la[k]);
	lazy(k<<1|1,mid+1,r,la[k]);
	la[k]=0;
	return ; 
}
void change(int k,int l,int r,int x,int y,int v)
{
	if(x>r || y<l) return ;
	if(x<=l && r<=y)
	{
		lazy(k,l,r,v);	
		return ;
	}
	pushdown(k,l,r);
	int mid=l+r>>1;
	change(k<<1,l,mid,x,y,v);
	change(k<<1|1,mid+1,r,x,y,v);
	sum[k]=sum[k<<1]+sum[k<<1|1];
	return ;
}
int add(int k,int l,int r,int x,int y)
{
	if(x>r||y<l)return 0;
	if(x<=l && r<=y)
		return sum[k];
	pushdown(k,l,r);
	int mid=l+r>>1;
	return add(k<<1,l,mid,x,y)+add(k<<1|1,mid+1,r,x,y);
}
int main()
{
	n=read(),m=read();
	build(1,1,n);
	while(m--)
	{
		int c,a,b;
		c=read(),a=read(),b=read();
		if(c==0)
			change(1,1,n,a,b,1);
		if(c==1)
			printf("%d\n",add(1,1,n,a,b));
	}
	return 0;
}
2024/11/29 15:31
加载中...