比赛 2025.3.6 评测结果 AAAAAAAAAA
题目名称 WHZ 的序列 最终得分 100
用户昵称 彭欣越 运行时间 3.095 s
代码语言 C++ 内存使用 11.81 MiB
提交时间 2025-03-06 19:41:13
显示代码纯文本
#include <bits/stdc++.h>
#define ls p*2
#define rs p*2+1
using namespace std;
typedef long long ll;
const int N=200010;
ll n,q,a[N];
struct node {
	int l,r;
	ll v,t; 
}tr[N*4];
void build (int p,int l,int r) {
	tr[p].l=l;
	tr[p].r=r;
	tr[p].t=0;
	if (l==r) {
		tr[p].v=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	tr[p].v=tr[ls].v+tr[rs].v;
}
void pushdown (int p) {
	tr[ls].t+=tr[p].t;
	tr[rs].t+=tr[p].t;
	if ((tr[ls].r-tr[ls].l+1)%2==1) {
        if (tr[ls].l%2==1) tr[ls].v+=tr[p].t;
        else tr[ls].v-=tr[p].t;
    }
    if ((tr[rs].r-tr[rs].l+1)%2==1) {
        if (tr[rs].l%2==1) tr[rs].v+=tr[p].t;
        else tr[rs].v-=tr[p].t;
    }
	tr[p].t=0;
}
ll query (int p,int l,int r) {
	if (tr[p].l>=l&&tr[p].r<=r) return tr[p].v;
	int mid=(tr[p].l+tr[p].r)/2;
	ll sum=0;
	pushdown(p);
	if (l<=mid) sum+=query(ls,l,r);
	if (r>mid) sum+=query(rs,l,r);
	return sum;
}
void update (int p,int l,int r,ll k) {
	if (tr[p].l>=l&&tr[p].r<=r) {
		tr[p].t+=k;
		if ((tr[p].r-tr[p].l+1)%2==1) {
		    if (tr[p].l%2==1) tr[p].v+=k;
		    else tr[p].v-=k;
        }
		return;
	}
	int mid=(tr[p].l+tr[p].r)/2;
	pushdown(p);
	if (l<=mid) update(ls,l,r,k);
	if (r>mid) update(rs,l,r,k);
	tr[p].v=tr[ls].v+tr[rs].v;
}
int main () {
    freopen("whz_sequence.in","r",stdin);
    freopen("whz_sequence.out","w",stdout);
	cin >> n;
	for (int i=1;i<=n;i++) {
        cin >> a[i];
	    if (i%2==0) a[i]*=-1;
    }
	build(1,1,n);
	cin >> q;
	while (q--) {
		int opt,l,r,k,t;
		cin >> opt >> l >> r;
		if (l%2==1) t=1;
		else t=-1;
		if (opt==1) {
			cin >> k;
			update(1,l,r,k);
		}else{
			cout << query(1,l,r)*t <<endl;
		}
	}
	return 0;
}