#include <iostream>
#include <fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int NMAX = 15001;
int v[NMAX],segment_tree[4*NMAX];
void build( int node, int left, int right ){
if( left == right )
segment_tree[node] = v[left];
else{
int mid = ( left + right ) / 2;
build( node * 2, left , mid );
build( node * 2 + 1 , mid + 1 , right );
segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
}
}
int query( int node, int left, int right, int query_left, int query_right ){
if( query_left <= left && right <= query_right )
return segment_tree[node];
int mid = ( left + right ) / 2;
if( query_right <= mid )
return query( node * 2, left, mid, query_left, query_right );
if( mid + 1 <= query_left )
return query( node * 2 + 1, mid + 1, right, query_left, query_right );
return query( node * 2, left, mid, query_left, query_right ) + query( node * 2 + 1, mid + 1, right, query_left, query_right );
}
void update( int node, int left, int right, int poz, int val ){
if( left == right )
segment_tree[node] -= val;
else{
int mid = ( left + right ) / 2;
if( poz <= mid )
update( node * 2, left, mid, poz, val );
else
update( node * 2 + 1, mid + 1, right, poz, val );
segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
}
}
int main()
{
int n, q;
in >> n >> q;
for( int i = 1; i <= n ; i++ )
in >> v[i];
build(1,1,n);
while( q-- ){
bool x;
in >> x;
if( x ){
int left, right;
in >> left >> right;
out << query( 1, 1, n, left, right) << "\n";
}
else{
int poz, val;
in >> poz >> val;
update( 1, 1, n, poz, val);
}
}
return 0;
}