#include #define MAX 4000000 using namespace std; typedef long long ll; void ConsTree(ll arr[],ll segtree[],ll low,ll high,ll pos) { if(low == high) { segtree[pos] = arr[low]; return; } ll mid = (low+high)/2; ConsTree(arr,segtree,low,mid,2*pos+1); ConsTree(arr,segtree,mid+1,high,2*pos+2); segtree[pos] = segtree[2*pos+1] + segtree[2*pos+2]; } ll query(ll segtree[],ll lazy[],ll qlow,ll qhigh,ll low,ll high,ll pos) { if(low > high) return 0; if(qlow>high || qhigh=high) return segtree[pos]; ll mid = (low+high)/2; return query(segtree,lazy,qlow,qhigh,low,mid,2*pos+1) + query(segtree,lazy,qlow,qhigh,mid+1,high,2*pos+2); } void update(ll segtree[],ll lazy[],ll start,ll end,ll delta,ll low,ll high,ll pos) { if(low>high) return; if(lazy[pos] != 0) { segtree[pos] += lazy[pos]*(high-low+1); if(low!=high) { lazy[2*pos+1] += lazy[pos]; lazy[2*pos+2] += lazy[pos]; } lazy[pos] = 0; } if(start > high || end < low) return; if(start <= low && end >= high) { segtree[pos] += delta*(high-low+1); if(low != high) { lazy[2*pos+1] += delta; lazy[2*pos+2] += delta; } return; } ll mid = (low+high)/2; update(segtree,lazy,start,end,delta,low,mid,2*pos+1); update(segtree,lazy,start,end,delta,mid+1,high,2*pos+2); segtree[pos] = segtree[2*pos+1] + segtree[2*pos+2]; } int main() { ll n,c; scanf("%lld %lld",&n,&c); ll arr[n]={0},p,q,v,choice; ll segtree[MAX],lazy[MAX]={0}; ConsTree(arr,segtree,0,n-1,0); while(c--) { scanf("%lld",&choice); if(choice == 0) { scanf("%lld %lld %lld",&p,&q,&v); update(segtree,lazy,p-1,q-1,v,0,n-1,0); } else { scanf("%lld %lld",&p,&q); printf("%lld\n",query(segtree,lazy,p-1,q-1,0,n-1,0)); } } return 0; }