卡了 2 天都还是 70 分。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,op,a,b,c,z[100000];
struct aaa
{
int l;
int r;
int sum;
int lt;
}tree[1000000]={0};
inline int read()
{
int x=0,y=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') y=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+(ch-'0'),ch=getchar();
return x*y;
}
inline void build(int l,int r,int k)
{
tree[k].l=l,tree[k].r=r;
if(l==r)
{
tree[k].sum=z[l];return;
}
int mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}
inline void push_down(int k)
{
if(tree[k].lt)
{
tree[k*2].lt+=tree[k].lt;
tree[k*2+1].lt+=tree[k].lt;
tree[k*2].sum+=tree[k].lt*(tree[k*2].r-tree[k*2].l+1);
tree[k*2+1].sum+=tree[k].lt*(tree[k*2+1].r-tree[k*2+1].l+1);
tree[k].lt=0;
}
}
inline void add(int l,int r,int k)
{
if(tree[k].l>=l&&tree[k].r<=r)
{
tree[k].sum+=c*(tree[k].r-tree[k].l+1);
tree[k].lt+=c;
return;
}
push_down(k);
if(tree[k*2].r>=l) add(l,r,k*2);
if(tree[k*2+1].l<=r) add(l,r,k*2+1);
tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}
inline int search(int l,int r,int k)
{
if(tree[k].l>=l&&tree[k].r<=r) return tree[k].sum;
push_down(k);
int ans=0;
if(tree[k*2].r>=l) ans+=search(l,r,k*2);
if(tree[k*2+1].l<=r) ans+=search(l,r,k*2+1);
return ans;
}
signed main()
{
n=read(),m=read();
for(register int i=1;i<=n;i++) z[i]=read();
build(1,n,1);
for(register int i=1;i<=m;i++)
{
op=read();
if(op==1) a=read(),b=read(),c=read(),add(a,b,1);
if(op==2) a=read(),b=read(),printf("%d\n",search(a,b,1));
}
return 0;
}