比赛 |
2025.3.6 |
评测结果 |
AAAAAAAAAA |
题目名称 |
WHZ 的序列 |
最终得分 |
100 |
用户昵称 |
darkMoon |
运行时间 |
1.488 s |
代码语言 |
C++ |
内存使用 |
11.84 MiB |
提交时间 |
2025-03-06 19:10:00 |
显示代码纯文本
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define int long long
using namespace std;
auto IN = freopen("whz_sequence.in", "r", stdin);
auto OUT = freopen("whz_sequence.out", "w", stdout);
auto IOS = ios::sync_with_stdio(false);
auto CIN = cin.tie(nullptr);
int mread(){
int x = 0, f = 1;
char c = cin.get();
while(c < '0' || c > '9'){
if(c == '-'){
f = -1;
}
c = cin.get();
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0';
c = cin.get();
}
return x * f;
}
const int N = 2e5 + 5;
int a[N];
struct tree{
int s[N << 2], la[N << 2], len[N << 2];
void pushup(int x){
s[x] = s[x << 1];
if(len[x << 1] & 1){
s[x] -= s[x << 1 | 1];
}
else{
s[x] += s[x << 1 | 1];
}
return;
}
void update(int x, int k){
la[x] += k;
if(len[x] & 1){
s[x] += k;
}
return;
}
void pushdown(int x){
if(la[x]){
update(x << 1, la[x]);
update(x << 1 | 1, la[x]);
la[x] = 0;
}
return;
}
void build(int x, int nl, int nr){
len[x] = nr - nl + 1;
s[x] = la[x] = 0;
if(nl == nr){
s[x] = a[nl];
return;
}
int mid = nl + nr >> 1;
build(x << 1, nl, mid);
build(x << 1 | 1, mid + 1, nr);
pushup(x);
return;
}
void add(int x, int nl, int nr, int l, int r, int k){
if(nl >= l && nr <= r){
update(x, k);
return;
}
int mid = nl + nr >> 1;
pushdown(x);
if(l <= mid){
add(x << 1, nl, mid, l, r, k);
}
if(mid + 1 <= r){
add(x << 1 | 1, mid + 1, nr, l, r, k);
}
pushup(x);
return;
}
pair<int, int> query(int x, int nl, int nr, int l, int r){
if(nl >= l && nr <= r){
return mp(s[x], len[x]);
}
pushdown(x);
int mid = nl + nr >> 1, ans = 0, len = 0;
if(l <= mid){
auto tmp = query(x << 1, nl, mid, l, r);
ans = tmp.fi, len = tmp.se;
}
if(mid + 1 <= r){
auto tmp = query(x << 1 | 1, mid + 1, nr, l, r);
if(len & 1){
ans -= tmp.fi;
}
else{
ans += tmp.fi;
}
len += tmp.se;
}
return mp(ans, len);
}
}tr;
int n = mread();
signed main(){
for(int i = 1; i <= n; i ++){
a[i] = mread();
}
tr.build(1, 1, n);
int q = mread();
while(q --){
int op = mread();
if(op == 1){
int l = mread(), r = mread(), k = mread();
tr.add(1, 1, n, l, r, k);
}
else{
int l = mread(), r = mread();
cout << tr.query(1, 1, n, l, r).fi << "\n";
}
}
return 0;
}