#include <stdio.h>
#define N 15000
#define UPDATE 0
#define QUERY 1
short v[N];
int aint[N * 2];
int n;
int leftSon( int node ) { return node + 1; }
int rightSon( int node, int low, int high ) {
int middle = (low + high) / 2;
return node + (middle - low + 1) * 2;
}
void build( int node, int low, int high ) {
if ( low == high ) {
aint[node] = v[low];
return;
}
int leftChild, rightChild, middle = (low + high) / 2;
leftChild = leftSon( node );
rightChild = rightSon( node, low, high );
build( leftChild, low, middle );
build( rightChild, middle + 1, high );
aint[node] = aint[leftChild] + aint[rightChild];
}
void update( int node, int low, int high, int poz, int val ) {
if ( low == poz && low == high ) {
aint[node] = v[poz] = v[poz] - val;
return;
}
int leftChild, rightChild, middle = (low + high) / 2;
leftChild = leftSon( node );
rightChild = rightSon( node, low, high );
if ( poz <= middle )
update( leftChild, low, middle, poz, val );
if ( middle + 1 <= poz )
update( rightChild, middle + 1, high, poz, val );
aint[node] = aint[leftChild] + aint[rightChild];
}
int query( int node, int low, int high, int ql, int qr ) {
if ( ql <= low && high <= qr )
return aint[node];
int leftChild, rightChild, middle = (low + high) / 2, ans = 0;
leftChild = leftSon( node );
rightChild = rightSon( node, low, high );
if ( ql <= middle )
ans += query( leftChild, low, middle, ql, qr );
if ( middle + 1 <= qr )
ans += query( rightChild, middle + 1, high, ql, qr );
return ans;
}
int main() {
FILE *fin, *fout;
int q, pb, a, b;
fin = fopen( "datorii.in", "r" );
fout = fopen( "datorii.out", "w" );
fscanf( fin, "%d%d", &n, &q );
for ( int i = 0; i < n; i ++ )
fscanf( fin, "%hd", &v[i] );
build( 1, 0, n - 1 );
for ( int i = 0; i < q; i ++ ) {
fscanf( fin, "%d%d%d", &pb, &a, &b );
if ( pb == UPDATE )
update( 1, 0, n - 1, a - 1, b );
else
fprintf( fout, "%d\n", query( 1, 0, n - 1, a - 1, b - 1 ) );
}
fclose( fin );
fclose( fout );
return 0;
}