比赛 EYOI与SBOI开学欢乐赛13th 评测结果 AAAAAAAAAA
题目名称 WHZ 的序列 最终得分 100
用户昵称 op_组撒头屯 运行时间 2.028 s
代码语言 C++ 内存使用 20.46 MiB
提交时间 2022-10-21 19:11:48
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200000+5;
int n,q;
ll a[N];
struct sdf{
	int l,r;ll val,tag;
}tr[4*N];
void pushup(int pt){
	tr[pt].val=tr[pt*2].val+tr[pt*2+1].val;
	return ;
}
void build(int pt,int l,int r){
	tr[pt]={l,r,0,0};
	if (l==r){
		tr[pt].val=(l&1)?a[l]:-a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(pt*2,l,mid);build(pt*2+1,mid+1,r);
	pushup(pt);
	return ;
}
void update(int pt,ll w){
	int l=tr[pt].l,r=tr[pt].r;
	if ((l&1)&&!(r&1))return ;
	if (!(l&1)&&(r&1))return ;
	if ((l&1)&&(r&1))tr[pt].val+=w;
	if (!(l&1)&&!(r&1))tr[pt].val-=w;
	return ;
}
void spread(int pt){
	int l=tr[pt].l,r=tr[pt].r;
	if (tr[pt].tag!=0){
		tr[pt*2].tag+=tr[pt].tag;
		tr[pt*2+1].tag+=tr[pt].tag;
		update(pt*2,tr[pt].tag);
		update(pt*2+1,tr[pt].tag);
		tr[pt].tag=0;
	}
	return ;
}
void change(int pt,int x,int y,ll w){
	int l=tr[pt].l,r=tr[pt].r;
	if (x<=l&&r<=y){
		update(pt,w);
		tr[pt].tag+=w;
		return ;
	}
	spread(pt);
	int mid=(l+r)/2;
	if (x<=mid)change(pt*2,x,y,w);
	if (mid+1<=y)change(pt*2+1,x,y,w);
	pushup(pt);
	return ;
}
ll query(int pt,int x,int y){
	int l=tr[pt].l,r=tr[pt].r;
	if (x<=l&&r<=y)return tr[pt].val;
	spread(pt);
	int mid=(l+r)/2;ll ans=0;
	if (x<=mid)ans+=query(pt*2,x,y);
	if (mid+1<=y)ans+=query(pt*2+1,x,y);
	return ans;
}
int main(){
	freopen ("whz_sequence.in","r",stdin);
	freopen ("whz_sequence.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	scanf("%d",&q);
	while(q--){
		int opt,l,r;scanf("%d%d%d",&opt,&l,&r);
		if (opt==1){
			ll w;scanf("%lld",&w);
			change(1,l,r,w);
		}
		else{
			ll ans=query(1,l,r);
			printf("%lld\n",(l&1)?ans:-ans);
		}
	}
	return 0;
}