#include<bits/stdc++.h>
using namespace std;
const int inf=2147483647;
int n,m,a[114514];
int opt,x,y,k;
struct node
{
int left,right;
int data;
int add;
};
node xianduan_tree[114514*4];
void spread(int p)
{
if(xianduan_tree[p].add)
{
xianduan_tree[p*2].data+=xianduan_tree[p].add*(xianduan_tree[p*2].right-xianduan_tree[p*2].left+1);
xianduan_tree[p*2+1].data+=xianduan_tree[p].add*(xianduan_tree[p*2+1].right-xianduan_tree[p*2+1].left+1);
xianduan_tree[p*2].add+=xianduan_tree[p].data;
xianduan_tree[p*2+1].add+=xianduan_tree[p].data;
xianduan_tree[p].add=0;
}
}
void build(int p,int l,int r)
{
xianduan_tree[p].left=l;
xianduan_tree[p].right=r;
if(l==r) xianduan_tree[p].data=a[l];
else
{
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
xianduan_tree[p].data=xianduan_tree[p*2].data+xianduan_tree[p*2+1].data;
}
}
void change_data(int p,int l,int r,int d)
{
if(l<=xianduan_tree[p].left&&r>=xianduan_tree[p].right)
{
xianduan_tree[p].data+=(long long) d*(xianduan_tree[p].right-xianduan_tree[p].left+1);
xianduan_tree[p].add+=d;
}
else
{
spread(p);
int mid=(xianduan_tree[p].left+xianduan_tree[p].right)>>1;
if(l<=mid) change_data(p*2,l,r,d);
if(r>mid) change_data(p*2+1,l,r,d);
xianduan_tree[p].data=xianduan_tree[p*2].data+xianduan_tree[p*2].data;
}
}
int ask(int p,int l,int r)
{
if(l<=xianduan_tree[p].left&&r>=xianduan_tree[p].right) return xianduan_tree[p].data;
spread(p);
int mid=(xianduan_tree[p].left+xianduan_tree[p].right)>>1;
int ans=0;
if(l<=mid) ans=ans+ask(p*2,l,mid);
if(r>mid) ans=ans+ask(p*2,mid+1,r);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&opt,&x,&y);
if(opt==1)
{
scanf("%d",&k);
change_data(1,x,y,k);
}
if(opt==2)
cout<<ask(1,x,y)<<endl;
}
return 0;
}
输到 2 x y时代码卡S, Why?