10分线段树
查看原帖
10分线段树
114012
chichichichi楼主2020/10/13 21:41

直角三角形

#include<cstdio>
using namespace std;
const int maxn=1e5+10;
struct node{
	long long l,r,f,p;
	#define l(x) c[x].l
	#define r(x) c[x].r
	#define f(x) c[x].f
	#define p(x) c[x].p
}c[maxn*4];
long long  n,m,ans;
void build(int l,int r,int w)
{
	l(w)=l,r(w)=r;
	if(l==r)
	{
		p(w)=0;
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,w*2);
	build(mid+1,r,w*2+1);
	p(w)=p(w*2)+p(w*2+1);
	return ;
}
void spread(int w)
{
	if(f(w))
	{
		p(w*2)+=f(w)*(r(w*2)-l(w*2)+1);
		p(w*2+1)+=f(w)*(r(w*2+1)-l(w*2+1)+1);
		f(w*2)+=f(w);
		f(w*2+1)=+f(w);
		f(w)=0;
	}
}
void change(int l,int r,int w)
{
	if(l(w)>=l&&r(w)<=r)
	{
		f(w)++;
		p(w)+=(r(w)-l(w)+1);
		return ;
	}
	spread(w);
	int mid=(l(w)+r(w))>>1;
	if(l<=mid)
	change(l,r,w*2);
	if(r>mid)
	change(l,r,w*2+1);
	p(w)=p(w*2)+p(w*2+1);
	return ;
}
void ask(int l,int w)
{
	if(l(w)==l&&r(w)==l)
	{
		ans=p(w)&1;
		return ;
	}
	spread(w);
	int mid=(l(w)+r(w))>>1;
	if(l<=mid)
	ask(l,w*2);
	if(l>mid)
	ask(l,w*2+1);
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int t,l,r,x;
		scanf("%d",&t);
		if(t==1)
		{
			scanf("%d%d",&l,&r);
			change(l,r,1);
		}
		if(t==2)
		{
			scanf("%d",&x);
			ask(x,1);
			printf("%d\n",ans);
		}
	}
	return 0;
} 
2020/10/13 21:41
加载中...