using namespace std;
long long n,a[10000],l,r,m,x,y,k,choose,result[10000],tt=0;
struct tree{
int lt,rt,sum,l,r;
long long lazy;
}c[40000];
void build(int root,int lt,int rt){
c[root].sum=0;
c[root].lt=lt; c[root].rt=rt;
for(int i=lt;i<=rt;i++) c[root].sum+=a[i];
if(lt==rt) return;
int mid=(lt+rt)/2;
build(root*2,lt,mid); build(root*2+1,mid+1,rt);
}
void lazy(int x){
c[x*2].sum+=(c[x*2].rt-c[x*2].lt+1)*c[x].lazy;
c[x*2].lazy=c[x].lazy;
c[x*2+1].sum+=(c[x*2+1].rt-c[x*2+1].lt+1)*c[x].lazy;
c[x*2+1].lazy=c[x].lazy;
c[x].lazy=0;
}
long long search(int root,int ll,int rr){
if(c[root].lt==ll&&c[root].rt==rr) return c[root].sum;
int midd=(c[root].lt+c[root].rt)/2;
if(c[root].lazy!=0) lazy(root);
if(ll>midd) return search(root*2+1,ll,rr);
if(rr<=midd) return search(root*2,ll,rr);
return search(root*2,ll,midd)+search(root*2+1,midd+1,rr);
}
void update(int root,int xx,int yy,int date){
c[root].sum+=(yy-xx+1)*date;
if(c[root].lt==xx&&c[root].rt==yy){ c[root].lazy=date;return;
}
int mid=(c[root].lt+c[root].rt)/2;
if(xx>mid){update(root*2+1,xx,yy,date);return;}
if(yy<=mid) {update(root*2,xx,yy,date);return;}
update(root*2+1,mid+1,yy,date); update(root*2,xx,mid,date);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
//for(int i=1;i<=z;i++) cout<<c[i].lt<<c[i].rt<<endl;
for(int i=1;i<=m;i++){
cin>>choose;
if(choose==1){
cin>>x>>y>>k;
update(1,x,y,k);
}
if(choose==2){
cin>>x>>y;
tt+=1;
result[tt]=search(1,x,y);
}
}
for(int q=1;q<=tt;q++){
cout<<result[q];
if(q!=tt) cout<<endl;
}
return 0;
}
(是这样发帖吗QAQ)