比赛 |
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
//