比赛 2025.3.6 评测结果 AAAAAAAAAA
题目名称 WHZ 的序列 最终得分 100
用户昵称 djyqjy 运行时间 1.622 s
代码语言 C++ 内存使用 14.47 MiB
提交时间 2025-03-06 19:29:34
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int re()
{
	int f=1,num=0;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
	return num*f;
}
const int N=200010;
struct Seg
{
	int l,r,val,tag;
}o[4*N],e[4*N];
int n,q;
int a[N];
void push_upo(int p){o[p].val=o[p<<1].val+o[p<<1|1].val;}
void push_upe(int p){e[p].val=e[p<<1].val+e[p<<1|1].val;}
void buildo(int l,int r,int p)
{
	if(l>r) return;
	o[p]=(Seg){l,r,a[l*2-1],0};
	if(l==r) return;
	int mid=(l+r)/2;
	buildo(l,mid,p<<1);
	buildo(mid+1,r,p<<1|1);
	push_upo(p);
	return;
}
void builde(int l,int r,int p)
{
	if(l>r) return;
	e[p]=(Seg){l,r,a[l*2],0};
	if(l==r) return;
	int mid=(l+r)/2;
	builde(l,mid,p<<1);
	builde(mid+1,r,p<<1|1);
	push_upe(p);
	return;
}
void push_downo(int p)
{
	o[p<<1].tag+=o[p].tag;
	o[p<<1].val+=(o[p<<1].r-o[p<<1].l+1)*o[p].tag;
	o[p<<1|1].tag+=o[p].tag;
	o[p<<1|1].val+=(o[p<<1|1].r-o[p<<1|1].l+1)*o[p].tag;
	o[p].tag=0;
	return;
}
void push_downe(int p)
{
	e[p<<1].tag+=e[p].tag;
	e[p<<1].val+=(e[p<<1].r-e[p<<1].l+1)*e[p].tag;
	e[p<<1|1].tag+=e[p].tag;
	e[p<<1|1].val+=(e[p<<1|1].r-e[p<<1|1].l+1)*e[p].tag;
	e[p].tag=0;
	return;
}
void addo(int l,int r,int d,int p)
{
	if(l>r) return;
	if(l<=o[p].l&&o[p].r<=r)
	{
		o[p].tag+=d;
		o[p].val+=(o[p].r-o[p].l+1)*d;
		return;
	}
	push_downo(p);
	int mid=(o[p].l+o[p].r)/2;
	if(l<=mid) addo(l,r,d,p<<1);
	if(mid<r) addo(l,r,d,p<<1|1);
	push_upo(p);
	return;
}
void adde(int l,int r,int d,int p)
{
	if(l>r) return;
	if(l<=e[p].l&&e[p].r<=r)
	{
		e[p].tag+=d;
		e[p].val+=(e[p].r-e[p].l+1)*d;
		return;
	}
	push_downe(p);
	int mid=(e[p].l+e[p].r)/2;
	if(l<=mid) adde(l,r,d,p<<1);
	if(mid<r) adde(l,r,d,p<<1|1);
	push_upe(p);
	return;
}
int queryo(int l,int r,int p)
{
	if(l>r) return 0;
	if(l<=o[p].l&&o[p].r<=r) return o[p].val;
	push_downo(p);
	int mid=(o[p].l+o[p].r)/2,ans=0;
	if(l<=mid) ans+=queryo(l,r,p<<1);
	if(mid<r) ans+=queryo(l,r,p<<1|1);
	return ans;
}
int querye(int l,int r,int p)
{
	if(l>r) return 0;
	if(l<=e[p].l&&e[p].r<=r) return e[p].val;
	push_downe(p);
	int mid=(e[p].l+e[p].r)/2,ans=0;
	if(l<=mid) ans+=querye(l,r,p<<1);
	if(mid<r) ans+=querye(l,r,p<<1|1);
	return ans;
}
signed main()
{
	freopen("whz_sequence.in","r",stdin);
	freopen("whz_sequence.out","w",stdout);
	n=re();
	for(int i=1;i<=n;i++) a[i]=re();
	buildo(1,n/2+n%2,1);builde(1,n/2,1);
	q=re();
	int op,l,r,d;
	while(q--)
	{
		op=re();
		if(op==1)
		{
			l=re();r=re();d=re();
			adde(l/2+l%2,r/2,d,1);addo(l/2+1,r/2+r%2,d,1);
		}
		else
		{
			l=re();r=re();
			if(l%2) printf("%lld\n",queryo(l/2+1,r/2+r%2,1)-querye(l/2+1,r/2,1));
			else printf("%lld\n",querye(l/2,r/2,1)-queryo(l/2+1,r/2+r%2,1));
		}
	}
	return 0;
}