CSES - Shared codeLink to this code: https://cses.fi/paste/f96e5180d71d33451f11d0/
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
# define l2 log2
# define ll long long int
# define mm 1000000007
# define pb push_back
struct vertex{
    bool lazy=false;
    ll sum;
    int v=-1;
    int val=0;
};
vertex st[int(1e6)];
void fastIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
}
void applyincr(int ind,ll val,int s,int e){
    st[ind].sum+=(e-s+1)*val;
    if(s!=e){
        st[ind].lazy=true;
        st[ind].val+=val;
    }
}
void applyupd(int ind ,ll val,int s,int e){
    st[ind].sum=(e-s+1)*val;
    if(s!=e){
        st[ind].lazy=true;
        st[ind].v=val;
        st[ind].val=0;
    }
}
void push(int ind,int s,int e){
    if(st[ind].lazy){
        int mid=(s+e)/2;
        if(st[ind].v!=-1){
            applyupd(ind*2+1,st[ind].v+st[ind].val,s,mid);
            applyupd(ind*2+2,st[ind].v+st[ind].val,mid+1,e);
        }
        else if(st[ind].val!=0){
            applyincr(ind*2+1,st[ind].val,s,mid);
            applyincr(ind*2+2,st[ind].val,mid+1,e);
        }
        st[ind].lazy=false;
        st[ind].v=-1;
        st[ind].val=0;
    }
}
void ud2(int s,int e,int ind,int l,int r,ll val){
    if(s==l && e==r){
        applyupd(ind,val,s,e);
        return;
    }
    push(ind,s,e);
    int mid=(s+e)/2;
    if(r<=mid){
        ud2(s,mid,ind*2+1,l,r,val);
    }else if(l>mid){
        ud2(mid+1,e,ind*2+2,l,r,val);
    }else{
        ud2(s,mid,ind*2+1,l,mid,val);
        ud2(mid+1,e,ind*2+2,mid+1,r,val);
    }
    st[ind].sum=st[ind*2+1].sum+st[ind*2+2].sum;
}
void ud1(int s,int e,int ind,int l,int r,ll val){
    if(s==l && e==r){
        applyincr(ind,val,s,e);
        return;
    }
    push(ind,s,e);
    int mid=(s+e)/2;
    if(r<=mid){
        ud1(s,mid,ind*2+1,l,r,val);
    }else if(l>mid){
        ud1(mid+1,e,ind*2+2,l,r,val);
    }else{
        ud1(s,mid,ind*2+1,l,mid,val);
        ud1(mid+1,e,ind*2+2,mid+1,r,val);
    }
    st[ind].sum=st[ind*2+1].sum+st[ind*2+2].sum;
}
ll query(int s,int e,int ind,int l,int r){
    if(s==l && e==r){
        return st[ind].sum;
    }
    push(ind,s,e);
    int mid=(s+e)/2;
    if(r<=mid){
        return query(s,mid,ind*2+1,l,r);
    }else if(l>mid){
        return query(mid+1,e,ind*2+2,l,r);
    }else{
        return query(s,mid,ind*2+1,l,mid)+query(mid+1,e,ind*2+2,mid+1,r);
    }
}
void build(int s,int e,int ind,ll a[]){
    if(s==e){
        st[ind].sum=a[s];
        return;
    }
    int mid=(s+e)/2;
    build(s,mid,ind*2+1,a);
    build(mid+1,e,ind*2+2,a);
    st[ind].sum=st[ind*2+1].sum+st[ind*2+2].sum;
    return;
}
void solve(){
    int n,q;
    cin>>n>>q;
    ll a[n];
    for(ll &i:a){
        cin>>i;
    }
    build(0,n-1,0,a);
    for(int i=1;i<=q;i++){
        int qt;
        cin>>qt;
        if(qt==1){
            int l,r;ll val;
            cin>>l>>r>>val;
            l--;r--;
            ud1(0,n-1,0,l,r,val);
        }else if(qt==2){
            int l,r;ll val;
            l--;r--;
            cin>>l>>r>>val;
            ud2(0,n-1,0,l,r,val);
        }else{
            int l,r;
            cin>>l>>r;
            l--;r--;
            cout<<query(0,n-1,0,l,r)<<endl;
        }
    }
}
int main(){
    fastIO();
    // int t;
    // cin>>t;
    // while(t>0){
        solve();
    //     t--;
    // }
    return 0;
}