#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
FILE *fin, *fout;
const int NMAX = 15000;
int v[NMAX + 5], n;
vector <int> segmtree;
int last_row;
void build(int node, int left = 1, int right = last_row)
{
if(left == right and left > n)
{
segmtree[node] = 0;
return;
}
if(left == right)
{
segmtree[node] = v[left];
return;
}
int mid = (left + right) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
segmtree[node] = segmtree[2 * node] + segmtree[2 * node + 1];
}
void update(int day, int value, int node = 1, int left = 1, int right = last_row)
{
if(left == right and left > n)
{
segmtree[node] = 0;
return;
}
if(left == right)
{
segmtree[node] -= value;
return;
}
int mid = (left + right) / 2;
if(day <= mid)
update(day, value, 2 * node, left, mid);
else
update(day, value, 2 * node + 1, mid + 1, right);
segmtree[node] = segmtree[2 * node] + segmtree[2 * node + 1];
}
int query(int q_left, int q_right, int node = 1, int left = 1, int right = last_row)
{
if(q_left <= left and q_right >= right)
return segmtree[node];
int mid = (left + right) / 2;
int leftans = 0, rightans = 0;
if(q_left <= mid)
leftans += query(q_left, q_right, 2 * node, left, mid);
if(q_right > mid)
rightans += query(q_left, q_right, 2 * node + 1, mid + 1, right);
return leftans + rightans;
}
int main()
{
fin = fopen("datorii.in", "r");
fout = fopen("datorii.out", "w");
int q;
fscanf(fin, "%d%d", &n, &q);
int i;
for(i = 1; i <= n; i++)
fscanf(fin, "%d", &v[i]);
int exp = log2(n), nodes;
if(1 << exp == n)
nodes = 2 * (1 << exp) - 1;
else
{
exp++;
nodes = 2 * (1 << exp) - 1;
}
segmtree.resize(nodes + 5);
last_row = 1 << exp;
build(1, 1, last_row);
int a, b , test;
for(i = 1; i <= q; i++)
{
fscanf(fin, "%d%d%d", &test, &a, &b);
if(test == 0)
update(a, b);
else fprintf(fout, "%d\n", query(a, b));
}
fclose(fin);
fclose(fout);
return 0;
}