#include <fstream>
using namespace std ;
ifstream cin("datorii.in") ;
ofstream cout("datorii.out") ;
int n, q, a[15005], tree[405005] ;
int query(int node, int left, int right, int query_left, int query_right)
{
if (query_left <= left && right <= query_right)
{
return tree[node] ;
}
else
{
int middle = (left + right) / 2 ;
if (query_right <= middle)
return query(node * 2, left, middle, query_left, query_right) ;
if (middle + 1 <= query_left)
return query(node * 2 + 1, middle + 1, right, query_left, query_right) ;
return query(node * 2, left, middle, query_left, query_right) + query(node * 2 + 1, middle + 1, right, query_left, query_right) ;
}
}
void build(int node, int left, int right)
{
if (left == right)
tree[node] = a[left] ;
else
{
int middle = (left + right) / 2 ;
build (node * 2, left, middle) ;
build (node * 2 + 1, middle + 1, right) ;
tree[node] = tree[node * 2] + tree[node * 2 + 1] ;
}
}
void update(int node, int left, int right, int position, int new_value)
{
if (left == right)
tree[node] -= new_value ;
else
{
int middle = (left + right) / 2 ;
if (position <= middle)
update(node * 2, left, middle, position, new_value) ;
else
update(node * 2 + 1, middle + 1, right, position, new_value) ;
tree[node] = tree[node * 2] + tree[node * 2 + 1] ;
}
}
int main()
{
int op, pos, value, l, r ;
cin >> n >> q ;
for (int i = 1 ; i <= n ; i ++)
cin >> a[i] ;
build(1, 1, n) ;
for (int qq = 1 ; qq <= q ; qq ++)
{
cin >> op ;
if(!op)
{
cin >> pos >> value ;
update(1, 1, n, pos, value) ;
}
else
{
cin >> l >> r ;
cout << query(1, 1, n, l, r) << '\n' ;
}
}
return 0 ;
}