#include<bits/stdc++.h>
using namespace std;
//线段树区间更新,区间查询
#define maxn 1005
struct node
{
int sum,l,r,lazy;//区间求和
} tree[maxn];
int w[maxn];
void push_up(int k)//区间维护
{
tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}
void push_down(int k)//下传懒人标记
{
if(tree[k].l==tree[k].r)
{
tree[k].lazy=0;
return;
}
if(tree[k].lazy)
{
tree[k<<1].sum+=(tree[k<<1].r-tree[k<<1].l+1)*tree[k].lazy;
tree[k<<1|1].sum+=(tree[k<<1|1].r-tree[k<<1|1].l+1)*tree[k].lazy;
tree[k<<1].lazy+=tree[k].lazy;
tree[k<<1|1].lazy+=tree[k].lazy;
tree[k].lazy=0;
}
}
void set_tree(int k,int l,int r)
{
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
tree[k].sum=w[l];
return;
}
int mid=(l+r)>>1;
set_tree(k<<1,l,mid);
set_tree(k<<1|1,mid+1,r);
push_up(k);//区间维护
}
void setment(int k,int l,int r,int x)
{
if(tree[k].l==l&&tree[k].r==r)//在回溯过程中完成操作
{
tree[k].sum+=(r-l+1)*x;
tree[k].lazy+=x;
return;
}
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=r)
{
setment(k<<1,l,r,x);
}
else if(mid<l)
{
setment(k<<1|1,l,r,x);
}
else
{
setment(k<<1,l,mid,x);
setment(k<<1|1,mid+1,r,x);
}
push_up(k);
}
int query_ans(int k,int l,int r)//修改区间和单点不一样
{
if(tree[k].lazy)
push_down(k);
if(tree[k].l>=l&&tree[k].r<=r)
{
return tree[k].sum;
}
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=r)
{
return query_ans(k<<1,l,r);
}
else if(l>mid)
{
return query_ans(k<<1|1,l,r);
}
return query_ans(k<<1,l,mid)+query_ans(k<<1|1,mid+1,r);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
set_tree(1,1,n);
int l,r,x;
cin>>l>>r;
int ans=query_ans(1,l,r);
cout<<ans<<endl;
cin>>l>>r>>x;
setment(1,l,r,x);
cout<<query_ans(1,l,r)<<endl;
}