#include <iostream>
#include <fstream>
#define NMAX 15005
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int n, m, v[NMAX], tree[4*NMAX], op, zi, val, x, y;
void build(int node, int left, int right){
if(left == right){
tree[node] = v[left];
}
else{
int mid = (left + right) / 2;
int left_son = 2 * node;
int right_son = 2 * node + 1;
build(left_son, left, mid);
build(right_son, mid+1, right);
tree[node] = tree[left_son] + tree[right_son];
}
}
void update(int node, int left, int right, int position, int value){
if(left == right){
tree[node] -= value;
}
else{
int mid = (left + right) / 2;
int left_son = 2 * node;
int right_son = 2 * node + 1;
if(position <= mid){
update(left_son,left,mid,position,value);
}
else{
update(right_son,mid+1,right,position,value);
}
tree[node] = tree[left_son] + tree[right_son];
}
}
int query(int node, int left, int right, int x, int y){
if(x <= left && right <= y){
return tree[node];
}
else{
int mid = (left + right) / 2;
int left_son = 2 * node;
int right_son = 2 * node + 1;
int sum_left = 0, sum_right = 0;
if(x <= mid){
sum_left = query(left_son,left,mid,x,y);
}
if(mid+1 <= y){
sum_right = query(right_son,mid+1,right,x,y);
}
return (sum_left + sum_right);
}
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++){
in >> v[i];
}
build(1,1,n);
for(int i = 1; i <= m; i++){
in >> op;
if(op == 0){
in >> zi >> val;
update(1,1,n,zi,val);
}
if(op == 1){
in >> x >> y;
out << query(1,1,n,x,y) << '\n';
}
}
return 0;
}