比赛 |
2025.3.6 |
评测结果 |
AAAAAAAAAA |
题目名称 |
WHZ 的序列 |
最终得分 |
100 |
用户昵称 |
djyqjy |
运行时间 |
1.622 s |
代码语言 |
C++ |
内存使用 |
14.47 MiB |
提交时间 |
2025-03-06 19:29:34 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int re()
{
int f=1,num=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
return num*f;
}
const int N=200010;
struct Seg
{
int l,r,val,tag;
}o[4*N],e[4*N];
int n,q;
int a[N];
void push_upo(int p){o[p].val=o[p<<1].val+o[p<<1|1].val;}
void push_upe(int p){e[p].val=e[p<<1].val+e[p<<1|1].val;}
void buildo(int l,int r,int p)
{
if(l>r) return;
o[p]=(Seg){l,r,a[l*2-1],0};
if(l==r) return;
int mid=(l+r)/2;
buildo(l,mid,p<<1);
buildo(mid+1,r,p<<1|1);
push_upo(p);
return;
}
void builde(int l,int r,int p)
{
if(l>r) return;
e[p]=(Seg){l,r,a[l*2],0};
if(l==r) return;
int mid=(l+r)/2;
builde(l,mid,p<<1);
builde(mid+1,r,p<<1|1);
push_upe(p);
return;
}
void push_downo(int p)
{
o[p<<1].tag+=o[p].tag;
o[p<<1].val+=(o[p<<1].r-o[p<<1].l+1)*o[p].tag;
o[p<<1|1].tag+=o[p].tag;
o[p<<1|1].val+=(o[p<<1|1].r-o[p<<1|1].l+1)*o[p].tag;
o[p].tag=0;
return;
}
void push_downe(int p)
{
e[p<<1].tag+=e[p].tag;
e[p<<1].val+=(e[p<<1].r-e[p<<1].l+1)*e[p].tag;
e[p<<1|1].tag+=e[p].tag;
e[p<<1|1].val+=(e[p<<1|1].r-e[p<<1|1].l+1)*e[p].tag;
e[p].tag=0;
return;
}
void addo(int l,int r,int d,int p)
{
if(l>r) return;
if(l<=o[p].l&&o[p].r<=r)
{
o[p].tag+=d;
o[p].val+=(o[p].r-o[p].l+1)*d;
return;
}
push_downo(p);
int mid=(o[p].l+o[p].r)/2;
if(l<=mid) addo(l,r,d,p<<1);
if(mid<r) addo(l,r,d,p<<1|1);
push_upo(p);
return;
}
void adde(int l,int r,int d,int p)
{
if(l>r) return;
if(l<=e[p].l&&e[p].r<=r)
{
e[p].tag+=d;
e[p].val+=(e[p].r-e[p].l+1)*d;
return;
}
push_downe(p);
int mid=(e[p].l+e[p].r)/2;
if(l<=mid) adde(l,r,d,p<<1);
if(mid<r) adde(l,r,d,p<<1|1);
push_upe(p);
return;
}
int queryo(int l,int r,int p)
{
if(l>r) return 0;
if(l<=o[p].l&&o[p].r<=r) return o[p].val;
push_downo(p);
int mid=(o[p].l+o[p].r)/2,ans=0;
if(l<=mid) ans+=queryo(l,r,p<<1);
if(mid<r) ans+=queryo(l,r,p<<1|1);
return ans;
}
int querye(int l,int r,int p)
{
if(l>r) return 0;
if(l<=e[p].l&&e[p].r<=r) return e[p].val;
push_downe(p);
int mid=(e[p].l+e[p].r)/2,ans=0;
if(l<=mid) ans+=querye(l,r,p<<1);
if(mid<r) ans+=querye(l,r,p<<1|1);
return ans;
}
signed main()
{
freopen("whz_sequence.in","r",stdin);
freopen("whz_sequence.out","w",stdout);
n=re();
for(int i=1;i<=n;i++) a[i]=re();
buildo(1,n/2+n%2,1);builde(1,n/2,1);
q=re();
int op,l,r,d;
while(q--)
{
op=re();
if(op==1)
{
l=re();r=re();d=re();
adde(l/2+l%2,r/2,d,1);addo(l/2+1,r/2+r%2,d,1);
}
else
{
l=re();r=re();
if(l%2) printf("%lld\n",queryo(l/2+1,r/2+r%2,1)-querye(l/2+1,r/2,1));
else printf("%lld\n",querye(l/2,r/2,1)-queryo(l/2+1,r/2+r%2,1));
}
}
return 0;
}