比赛 |
EYOI与SBOI开学欢乐赛13th |
评测结果 |
AAAAAAAAAA |
题目名称 |
WHZ 的序列 |
最终得分 |
100 |
用户昵称 |
ZRQ |
运行时间 |
1.065 s |
代码语言 |
C++ |
内存使用 |
26.56 MiB |
提交时间 |
2022-10-21 19:58:01 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#define c t[p]
#define ls p<<1
#define rs p<<1|1
#define ll long long
using namespace std;
const int N=400005;
struct node
{
ll a,tag;
}t[N<<2];
int n,q;
ll a[N],x,f;
char ch;
inline ll read(){x=0;f=1;ch=getchar();while(ch<48||ch>57){if(ch==45)f=-1;ch=getchar();}while(ch>47&&ch<58)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;}
void build(int p,int l,int r)
{
if(l==r)
{
c.a=a[l];
return ;
}
int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
if((mid-l+1)&1) c.a=t[ls].a-t[rs].a;
else c.a=t[ls].a+t[rs].a;
return ;
}
void lazydown(int p,int L,int R)
{
int mid=L+R>>1;
t[ls].tag+=c.tag;
if((mid-L+1)&1) t[ls].a+=c.tag;
t[rs].tag+=c.tag;
if((R-mid)&1) t[rs].a+=c.tag;
c.tag=0;
return ;
}
void updata(int p,int l,int r,int L,int R,ll d)
{
if(L<=l&&r<=R)
{
c.tag+=d;
if((r-l+1)&1) c.a+=d;
return ;
}
if(c.tag) lazydown(p,l,r);
int mid=l+r>>1;
if(R<=mid) updata(ls,l,mid,L,R,d);
else if(L>mid) updata(rs,mid+1,r,L,R,d);
else updata(ls,l,mid,L,R,d),updata(rs,mid+1,r,L,R,d);
if((mid-l+1)&1) c.a=t[ls].a-t[rs].a;
else c.a=t[ls].a+t[rs].a;
return ;
}
ll query(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
if((l-L+1)&1) return c.a;
else return -c.a;
}
if(c.tag) lazydown(p,l,r);
int mid=l+r>>1;
if(R<=mid) return query(ls,l,mid,L,R);
else if(L>mid) return query(rs,mid+1,r,L,R);
return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int main()
{
freopen("whz_sequence.in","r",stdin);
freopen("whz_sequence.out","w",stdout);
n=read();
for(int i=1;i<=n;++i) a[i]=read();
build(1,1,n);
q=read();
int opt,l,r;
ll d;
for(int i=1;i<=q;++i)
{
opt=read(),l=read(),r=read();
if(opt==1)
{
d=read();
updata(1,1,n,l,r,d);
}
else printf("%lld\n",query(1,1,n,l,r));
}
return 0;
}