比赛 EYOI与SBOI开学欢乐赛13th 评测结果 AAAAAAAAAA
题目名称 WHZ 的序列 最终得分 100
用户昵称 ZRQ 运行时间 1.065 s
代码语言 C++ 内存使用 26.56 MiB
提交时间 2022-10-21 19:58:01
显示代码纯文本
#include<iostream>
#include<cstdio>
#define c t[p]
#define ls p<<1
#define rs p<<1|1
#define ll long long
using namespace std;
const int N=400005;
struct node
{
	ll a,tag;
}t[N<<2];
int n,q;
ll a[N],x,f;
char ch;
inline ll read(){x=0;f=1;ch=getchar();while(ch<48||ch>57){if(ch==45)f=-1;ch=getchar();}while(ch>47&&ch<58)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;}
void build(int p,int l,int r)
{
	if(l==r)
	{
		c.a=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	if((mid-l+1)&1) c.a=t[ls].a-t[rs].a;
	else c.a=t[ls].a+t[rs].a;
	return ;
}
void lazydown(int p,int L,int R)
{
	int mid=L+R>>1;
	t[ls].tag+=c.tag;
	if((mid-L+1)&1) t[ls].a+=c.tag;
	t[rs].tag+=c.tag;
	if((R-mid)&1) t[rs].a+=c.tag;
	c.tag=0;
	return ; 
}
void updata(int p,int l,int r,int L,int R,ll d)
{
	if(L<=l&&r<=R)
	{
		c.tag+=d;
		if((r-l+1)&1) c.a+=d;
		return ;
	}
	if(c.tag) lazydown(p,l,r);
	int mid=l+r>>1;
	if(R<=mid) updata(ls,l,mid,L,R,d);
	else if(L>mid) updata(rs,mid+1,r,L,R,d);
	else updata(ls,l,mid,L,R,d),updata(rs,mid+1,r,L,R,d);
	if((mid-l+1)&1) c.a=t[ls].a-t[rs].a;
	else c.a=t[ls].a+t[rs].a;
	return ;
}
ll query(int p,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)
	{
		if((l-L+1)&1) return c.a;
		else return -c.a;
	}
	if(c.tag) lazydown(p,l,r);
	int mid=l+r>>1;
	if(R<=mid) return query(ls,l,mid,L,R);
	else if(L>mid) return query(rs,mid+1,r,L,R);
	return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int main()
{
	freopen("whz_sequence.in","r",stdin);
	freopen("whz_sequence.out","w",stdout);
	n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	build(1,1,n);
	q=read();
	int opt,l,r;
	ll d;
	for(int i=1;i<=q;++i)
	{
		opt=read(),l=read(),r=read();
		if(opt==1)
		{
			d=read();
			updata(1,1,n,l,r,d);
		}
		else printf("%lld\n",query(1,1,n,l,r));
	}
	return 0;
}