#include <fstream>
#include <iostream>
using namespace std ;
ifstream f ("datorii.in") ;
ofstream g ("datorii.out") ;
int N , M , V[15005] , Arb_int[4*15000+5] ;
void creare_arb ( int indice_arbore_curent , int st , int dr )
{
if ( st == dr )
Arb_int[indice_arbore_curent] = V[st] ;
else
{
int m = ( st + dr ) / 2 ;
creare_arb ( 2 * indice_arbore_curent , st , m ) ;
creare_arb ( 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
Arb_int[indice_arbore_curent] = Arb_int[2*indice_arbore_curent] + Arb_int[2*indice_arbore_curent+1] ;
}
}
void update ( int i , int val , int indice_arbore_curent , int st , int dr )
{
if ( st == dr )
Arb_int[indice_arbore_curent] -= val ;
else
{
int m = ( st + dr ) / 2 ;
if ( i <= m )
update ( i , val , 2 * indice_arbore_curent , st , m ) ;
else
update ( i , val , 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
Arb_int[indice_arbore_curent] = Arb_int[2*indice_arbore_curent] + Arb_int[2*indice_arbore_curent+1] ;
}
}
int query ( int i , int j , int indice_arbore_curent , int st , int dr )
{
if ( i == st && j == dr ) //am ajuns intr-o celula in care este deja memorat raspunsul unui interval
return Arb_int[indice_arbore_curent] ;
int m = ( st + dr ) / 2 ;
if ( j <= m ) //intervalul se afla total in subarborele stang
return query ( i , j , 2 * indice_arbore_curent , st , m ) ;
if ( m < i ) //intervalul se afla total in subarborele drept
return query ( i , j , 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
//daca nu s-a indeplinit niciuna pana acum ... inseamna ca ne impartim in ambii subarbori
return query ( i , m , 2 * indice_arbore_curent , st , m ) + query ( m + 1 , j , 2 * indice_arbore_curent + 1 , m + 1 , dr ) ;
}
int main ()
{
f >> N >> M ;
for ( int i = 1 ; i <= N ; ++i )
f >> V[i] ;
creare_arb ( 1 , 1 , N ) ;
for ( int i = 1 ; i <= M ; ++i )
{
int tip , a , b ;
f >> tip >> a >> b ;
if ( tip == 1 )
g << query ( a , b , 1 , 1 , N ) << "\n" ;
else
update ( a , b , 1 , 1 , N ) ;
}
}