如题,
#include<iostream>
using namespace std;
int a[100001],n,m;
struct line {
int sum,l,r,tag;
} tree[1010];
inline int ls(int p) {
return p<<1;
}
inline int rs(int p) {
return p<<1|1;
}
void push_up(int p) {
tree[p].sum=tree[ls(p)].sum+tree[rs(p)].sum;
return ;
}
void build(int p,int l,int r) {
if(l==r) {
tree[l].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
return ;
}
void pass_tag(int p) {
if(tree[p].tag!=0) {
tree[ls(p)].tag+=tree[p].tag;
tree[rs(p)].tag+=tree[p].tag;
tree[ls(p)].sum+=tree[ls(p)].tag*(tree[ls(p)].r-tree[ls(p)].l+1);
tree[rs(p)].sum+=tree[rs(p)].tag*(tree[rs(p)].r-tree[rs(p)].l+1);
tree[p].tag=0;
}
return;
}
void add_tag(int p,int l,int r,int vary) {
if(l<=tree[p].l&&r>=tree[p].r) {
tree[p].tag+=vary;
tree[p].sum+=tree[p].tag*(tree[p].r-tree[p].l+1);
return ;
}
pass_tag(p);
int mid=tree[p].l+tree[p].r>>1;
if(l<=mid) {
add_tag(ls(p),l,r,vary);
}
if(r>=mid) {
add_tag(rs(p),l,r,vary);
}
push_up(p);
}
int check_block(int p,int l,int r) {
if(l<=p&&p<=r) {
return tree[p].sum;
} else {
pass_tag(p);
int sum,mid=(tree[p].l+tree[p].r)>>1;
if(l<=mid) {
sum+=check_block(ls(p),l,r);
}
if(r>=mid) {
sum+=check_block(rs(p),l,r);
}
return sum;
}
}
int main() {
int l,t,r,i,j,k,x1,y1;
scanf("%d%d",&m,&n);
for(i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
for(i=0; i<m; i++) {
scanf("%d",&t);
if(t==1){
scanf("%d%d%d",&x1,&y1,&k);
add_tag(1,x1,y1,k);
}else{
scanf("%d%d",&x1,&y1);
printf("%d\n",check_block(1,x1,y1));
}
}
return 0;
}