#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 1e5 + 5;
long long n,q;
struct Segment_tree
{
    vector<long long> st,lazy_x,lazy_y;
    void init(long long n)
    {
        if(n==0)
        {
            return;
        }
        st.assign(4*n+1,0);
        lazy_x.assign(4*n+1,0);
        lazy_y.assign(4*n+1,0);
    }
    long long cnt(long long l, long long r)
    {
        return r-l+1;
    }
    long long sum(long long l, long long r)
    {
        return (l+r)*cnt(l,r)/2;
    }
    void push_down(long long id, long long l, long long r)
    {
        if(l==r) return;

        long long mid = (l+r)>>1;
        long long x = lazy_x[id];
        long long y = lazy_y[id];

        lazy_x[2*id] += x;
        lazy_y[2*id] += y;

        lazy_x[2*id+1] += x;
        lazy_y[2*id+1] += y;

        st[2*id] += x*cnt(l,mid)+y*sum(l,mid);
        st[2*id+1] += x*cnt(mid+1,r)+y*sum(mid+1,r);

        lazy_x[id]=0;
        lazy_y[id]=0;
    }
    void update(long long id, long long l, long long r, long long u, long long v, long long x, long long y)
    {
        if(l>v||r<u) return;
        if(u<=l&&r<=v)
        {
            long long val=x-u*y;

            st[id] += val*cnt(l,r)+y*sum(l,r);

            lazy_x[id] += val;
            lazy_y[id] += y;

            return;
        }
        push_down(id,l,r);
        long long mid = (l+r)>>1;
        update(2*id,l,mid,u,v,x,y);
        update(2*id+1,mid+1,r,u,v,x,y);
        st[id]=st[2*id]+st[2*id+1];
    }
    long long get(long long id, long long l, long long r, long long u, long long v)
    {
        if(l>v||r<u) return 0;
        if(u<=l&&r<=v)
        {
            return st[id];
        }
        push_down(id,l,r);
        long long mid = (l+r)>>1;
        return get(2*id,l,mid,u,v)+get(2*id+1,mid+1,r,u,v);
    }
    void update(long long u, long long v, long long x, long long y)
    {
        update(1,1,n,u,v,x,y);
    }
    long long get(long long u, long long v)
    {
        return get(1,1,n,u,v);
    }
};
Segment_tree segtree;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> q;
    segtree.init(n);

    for(long long i=1; i<=q; i++)
    {
        long long num,l,r;
        cin >> num >> l >> r;
        if(num==1)
        {
            long long x,y;
            cin >> x >> y;
            segtree.update(l,r,x,y);
        }
        else
        {
            cout << segtree.get(l,r) << "\n";
        }
    }
}