#include <bits/stdc++.h>

using namespace std;

#define TRUE 1
#define FALSE 0

typedef long long ll;

ll n,q;
vector<ll> st,lazy;

void AddLazy(ll n,ll izq,ll der,ll v){
	lazy[n] += v;
	st[n] += (der-izq + 1)*v;
}

void PushLazy(ll n,ll izq,ll der){
	if(izq == der)
		return;
	ll m = (izq + der)/2;
	AddLazy(2*n,izq,m,lazy[n]);
	AddLazy(2*n+1,m + 1,der,lazy[n]);
	lazy[n] = 0;//Ya se utilizo
}

void build(ll n,ll izq,ll der){
	if(izq == der)
		st[n] = 0;
	else{
		ll m = (izq + der)/2;
		build(2*n,izq,m);
		build(2*n+1,m + 1,der);
		st[n] = st[2*n] + st[2*n + 1];
	}
	
}

ll query(ll n,ll izq,ll der,ll i,ll j){
	if(j < izq || der < i)
		return 0;
	if(i <= izq && der <= j)
		return st[n];
	PushLazy(n,izq,der);
	ll m = (izq + der)/2;
	
	ll p1 = query(2*n,izq,m,i,j);
	ll p2 = query(2*n+1,m + 1,der,i,j);
	
	return p1 + p2; 
}
void update(ll n,ll izq,ll der,ll i,ll j,ll v){
	if(j < izq || der < i)
		return;
	if(i <= izq && der <= j){
		AddLazy(n,izq,der,v);
		return;
	}
	PushLazy(n,izq,der);
	ll m = (izq + der)/2;
	update(2*n,izq,m,i,j,v);
	update(2*n + 1,m + 1,der,i,j,v);
	st[n] = st[2*n] + st[2*n + 1];
		
}

void BUILD(){
	build(1,1,n);
}
void UPDATE(ll i,ll j,ll v){
	update(1,1,n,i,j,v);
}
ll QUERY(ll i,ll j){
	return query(1,1,n,i,j); 
}


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n >> q;
	
	st.resize(4*n + 2);
	lazy.resize(4*n + 2);
	
	for(ll i = 0; i <= 4*n + 1;++i){
		st[i] = 0;
		lazy[i] = 0;
	}
	
	//BUILD();
	
	ll p,s,t,x;
	while(q--){
		cin >> p;
		if(p == 0){
			cin >> s >> t >> x;
			UPDATE(s,t,x);
		}
		else{
			cin >> s >> t;
			cout << QUERY(s,t) << '\n';
		}
	}
	

	//WAIT
}





