比赛 2025.3.6 评测结果 AAAATTTTTT
题目名称 WHZ 的序列 最终得分 40
用户昵称 LikableP 运行时间 13.217 s
代码语言 C++ 内存使用 7.66 MiB
提交时间 2025-03-06 21:19:22
显示代码纯文本
/*

       a1-a2+a3-a4+a5-a6+a7-a8
   a1-a2+a3-a4         a5-a6+a7-a8
 a1-a2     a3-a4     a5-a6     a7-a8
a1   -a2   a3  -a4   a5  -a6   a7  -a8
查询时若 l 为奇数则正常输出,若 l 为偶数则取反输出 
修改时区间修改只增加 lazy,单点修改若下标为奇数则 +=d,若下标为偶数则 -=d 
*/
#include <iostream>
#include <cstdio>
#include <fstream>
#define ls(root) root << 1
#define rs(root) root << 1 | 1
using namespace std;
typedef long long ll;

const int MAXN = 262144;

int n, q;
ll a[MAXN + 10], tree[(MAXN << 2) + 10], lazy[(MAXN << 2) + 10];

void Merge(int root) {
	tree[root] = tree[ls(root)] + tree[rs(root)];
}

void Build(int root, int lt, int rt) {
	if (lt == rt) {
		tree[root] = (ll)a[lt] * (lt & 1 ? 1 : -1);
		return ;
	}
	int mid = lt + ((rt - lt) >> 1);
	Build(ls(root), lt, mid);
	Build(rs(root), mid + 1, rt);
	Merge(root);
}

void PushDown(int root, int lt, int rt) {
	if (lazy[root]) {
		if (lt + 1 == rt) {
			tree[ls(root)] += lazy[root];
			tree[rs(root)] -= lazy[root];
		} else {
			lazy[ls(root)] += lazy[root];
			lazy[rs(root)] += lazy[root];	
		}
		lazy[root] = 0;
	}
}

void Add(int root, int lt, int rt, int lq, int rq, int val) {
	if (lt == lq && rt == rq) {
		if (lt == rt) {
			tree[root] += (ll)val * (lt & 1 ? 1 : -1);
			return ;
		}
		lazy[root] += val;
		return ;
	}
	PushDown(root, lt, rt);
	int mid = lt + ((rt - lt) >> 1);
	if (rq <= mid) {
		Add(ls(root), lt, mid, lq, rq, val);
	} else if (lq > mid) {
		Add(rs(root), mid + 1, rt, lq, rq, val);
	} else {
		Add(ls(root), lt, mid, lq, mid, val);
		Add(rs(root), mid + 1, rt, mid + 1, rq, val);
	}
	Merge(root);
}

ll Get(int root, int lt, int rt, int lq, int rq) {
	if (lt == rt && lq == rq) {
		return tree[root];
	}
	PushDown(root, lt, rt);
	int mid = lt + ((rt - lt) >> 1);
	if (rq <= mid) {
		return Get(ls(root), lt, mid, lq, rq);
	} else if (lq > mid) {
		return Get(rs(root), mid + 1, rt, lq, rq);
	} else {
		return Get(ls(root), lt, mid, lq, mid) + Get(rs(root), mid + 1, rt, mid + 1, rq);
	}
}

void print() {
	for (int i = 1; i <= n; ++i) {
		printf("%lld ", Get(1, 1, n, i, i));
	}
	printf("\n");
}

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]);
	}
	int two = 1;
	while (two < n) two *= 2;
	n = two;
	Build(1, 1, n);
//	print();
	scanf("%d", &q);
	while (q--) {
		int opt, l, r, d;
		scanf("%d %d %d", &opt, &l, &r);
		if (opt == 1) {
			scanf("%d", &d);
			Add(1, 1, n, l, r, d);
		} else {
			printf("%lld\n", Get(1, 1, n, l, r) * (l & 1 ? 1 : -1));
		}
//		print();
	}
	return 0;
}
// 200000
//