比赛 |
EYOI与SBOI开学欢乐赛13th |
评测结果 |
AAAAAAAAAA |
题目名称 |
WHZ 的序列 |
最终得分 |
100 |
用户昵称 |
op_组撒头屯 |
运行时间 |
2.028 s |
代码语言 |
C++ |
内存使用 |
20.46 MiB |
提交时间 |
2022-10-21 19:11:48 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200000+5;
int n,q;
ll a[N];
struct sdf{
int l,r;ll val,tag;
}tr[4*N];
void pushup(int pt){
tr[pt].val=tr[pt*2].val+tr[pt*2+1].val;
return ;
}
void build(int pt,int l,int r){
tr[pt]={l,r,0,0};
if (l==r){
tr[pt].val=(l&1)?a[l]:-a[l];
return ;
}
int mid=(l+r)/2;
build(pt*2,l,mid);build(pt*2+1,mid+1,r);
pushup(pt);
return ;
}
void update(int pt,ll w){
int l=tr[pt].l,r=tr[pt].r;
if ((l&1)&&!(r&1))return ;
if (!(l&1)&&(r&1))return ;
if ((l&1)&&(r&1))tr[pt].val+=w;
if (!(l&1)&&!(r&1))tr[pt].val-=w;
return ;
}
void spread(int pt){
int l=tr[pt].l,r=tr[pt].r;
if (tr[pt].tag!=0){
tr[pt*2].tag+=tr[pt].tag;
tr[pt*2+1].tag+=tr[pt].tag;
update(pt*2,tr[pt].tag);
update(pt*2+1,tr[pt].tag);
tr[pt].tag=0;
}
return ;
}
void change(int pt,int x,int y,ll w){
int l=tr[pt].l,r=tr[pt].r;
if (x<=l&&r<=y){
update(pt,w);
tr[pt].tag+=w;
return ;
}
spread(pt);
int mid=(l+r)/2;
if (x<=mid)change(pt*2,x,y,w);
if (mid+1<=y)change(pt*2+1,x,y,w);
pushup(pt);
return ;
}
ll query(int pt,int x,int y){
int l=tr[pt].l,r=tr[pt].r;
if (x<=l&&r<=y)return tr[pt].val;
spread(pt);
int mid=(l+r)/2;ll ans=0;
if (x<=mid)ans+=query(pt*2,x,y);
if (mid+1<=y)ans+=query(pt*2+1,x,y);
return ans;
}
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]);
}
build(1,1,n);
scanf("%d",&q);
while(q--){
int opt,l,r;scanf("%d%d%d",&opt,&l,&r);
if (opt==1){
ll w;scanf("%lld",&w);
change(1,l,r,w);
}
else{
ll ans=query(1,l,r);
printf("%lld\n",(l&1)?ans:-ans);
}
}
return 0;
}