#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef float fl;
typedef double dou;
typedef long double ld;
#define register int ri;
const ll inf = 1e9;
const ll inf_common = 0x3f3f3f3f;
const ll inf_larger = 0x7fffffff;
const ll inf_ll = 1e18;
const ll mod = 1e9 + 7;
const ll mod1 = 998244353;
const dou eps = 1e-6;
inline ll read()
{
ll ans = 0;
ll f = 1;
char c = getchar();
while( c < '0' || c > '9' )
{
if( c == '-' )
{
f = -1;
}
c = getchar();
}
while( c >= '0' && c <= '9' )
{
ans = ( ans << 3 ) + ( ans << 1 ) + ( c - 48 );
c = getchar();
}
return ans * f;
}
inline void write( ll x )
{
if( x < 0 )
{
putchar( '-' );
x = -x;
}
if( x > 9 )
{
write( x / 10 );
}
putchar( x % 10 + '0' );
}
int a[1000001] = {0};
int tree[1000001] = {0};
void build_tree( ll node , ll start , ll end )
{
ll mid = ( start + end ) / 2;
ll left_node = 2 * node + 1;
ll right_node = 2 * node + 2;
if( start == end )
{
tree[node] = a[start];
return;
}
build_tree( left_node , start , mid );
build_tree( right_node , mid + 1 , end );
tree[node] = tree[left_node] + tree[right_node];
}
ll k = 0;
void update_tree( ll node , ll start , ll end , ll l , ll r )
{
ll mid = ( start + end ) / 2;
ll left_node = 2 * node + 1;
ll right_node = 2 * node + 2;
ll sum_left = 0;
ll sum_right = 0;
if( r < start || l > end )
{
;
}
else if( start == end )
{
a[start] += k;
tree[node] += k;
}
else
{
update_tree( left_node , start , mid , l , r );
update_tree( right_node , mid + 1 , end , l , r );
tree[node] += k;
}
}
ll query_tree( ll node , ll start , ll end , ll l , ll r )
{
ll mid = ( start + end ) / 2;
ll left_node = 2 * node + 1;
ll right_node = 2 * node + 2;
ll sum_left = 0;
ll sum_right = 0;
if( r < start || l > end )
{
return 0;
}
else if( start == end )
{
return tree[node];
}
else
{
sum_left = query_tree( left_node , start , mid , l , r );
sum_right = query_tree( right_node , mid + 1 , end , l , r );
return sum_left + sum_right;
}
}
int main()
{
ll i = 0;
ll n = read();
ll m = read();
ll type = 0;
ll x = 0;
ll y = 0;
for( i = 0 ; i < n ; i++ )
{
a[i] = read();
}
build_tree( 0 , 0 , n );
while( m-- )
{
type = read();
x = read();
y = read();
if( type == 1 )
{
k = read();
update_tree( 0 , 0 , n , x - 1 , y - 1 );
}
else
{
write( query_tree( 0 , 0 , n , x - 1 , y - 1 ) );
putchar( '\n' );
}
}
return 0;
}