#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int N=100005;
int ql,qr,d,sum;
int n,m;
struct Tree{
int addv[4*N],sumv[4*N];
void maintain(int o,int L,int R)
{
int lc=o*2,rc=o*2+1;
if (L<R)sumv[o]=sumv[lc]+sumv[rc];
sumv[o]+=addv[o]*(R-L+1);
}
void pushdown(int o)
{
int lc=o*2,rc=o*2+1;
if (addv[o])
{
addv[lc]+=addv[o];
addv[rc]+=addv[o];
addv[o]=0;
}
}
void update(int o,int L,int R)
{
int lc=o*2,rc=o*2+1;
if (ql<=L&&R<=qr)addv[o]+=d;
else
{
pushdown(o);
int M=L+(R-L)/2;
if (ql<=M)update(lc,L,M);else maintain(lc,L,M);
if (M<qr)update(rc,M+1,R);else maintain(rc,M+1,R);
}
maintain(o,L,R);
}
void query(int o,int L,int R,int add)
{
int lc=o*2,rc=o*2+1;
if (ql<=L&&R<=qr)
{
sum+=sumv[o]+add*(R-L+1);
printf("%d %d %d %d\n",sum,sumv[o],add,addv[o]);
}
else
{
int M=L+(R-L)/2;
if (ql<=M)query(lc,L,M,add+addv[o]);
if (M<qr)query(rc,M+1,R,add+addv[o]);
}
}
} tree;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
int w;
scanf("%d",&w);
ql=qr=i;d=w;
tree.update(1,1,n);
}
for (int i=1;i<=m;i++)
{
int op;int x,y;
scanf("%d%d%d",&op,&ql,&qr);
if (op==1)
{
scanf("%d",&d);
tree.update(1,1,n);
}
if (op==2)
{
sum=0;
tree.query(1,1,n,0);
printf("%d\n",sum);
}
}
return 0;
}
请求dalao查错,万分感谢啊