比赛 |
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;
}