#include <stdio.h>
#include <vector>
using namespace std;
int n, pos, val, sum, seq_start, seq_end;
vector<int> arb;
vector<int> init;
void solve();
void insert(int, int, int);
void query(int, int, int);
void update(int, int, int);
int main()
{
solve();
return 0;
}
void solve()
{
int m, x, y, z;
FILE *fin = fopen("datorii.in", "r");
FILE *fout = fopen("datorii.out", "w");
fscanf(fin, "%d%d", &n, &m);
arb.resize(4 * n);
init.resize(n + 1);
for (pos = 1; pos <= n; ++pos)
{
fscanf(fin, "%d", &val);
insert(1, 1, n);
}
for (; m; --m)
{
fscanf(fin, "%d%d%d", &x, &y, &z);
if (x) //query
{
// printf("query: %d %d\n", y, z);
seq_start = y;
seq_end = z;
sum = 0;
query(1, 1, n);
fprintf(fout, "%d\n", sum);
}
else //update
{
// printf("update: pozitia %d, scad %d\n", y, z);
pos = y;
val = z;
update(1, 1, n);
}
/*
for (int i = 1; i <= 4 * n; ++i)
{
printf("%d ", arb[i]);
}
printf("\n");
*/ }
fclose(fin);
fclose(fout);
}
void query(int nod, int st, int dr)
{
if (seq_start <= st && dr <= seq_end)
{
sum += arb[nod];
}
else
{
int mid = (st + dr) / 2;
if (seq_start <= mid)
{
query(2 * nod, st, mid);
}
if (mid < seq_end)
{
query(2 * nod + 1, mid + 1, dr);
}
}
}
void insert(int nod, int st, int dr)
{
if (st == dr)
{
arb[nod] = val;
init[pos] = nod;
}
else
{
int mid = (st + dr) / 2;
if (pos <= mid)
{
insert(2 * nod, st, mid);
}
else
{
insert(2 * nod + 1, mid + 1, dr);
}
arb[nod] = arb[2*nod] + arb[2*nod+1];
}
}
void update(int nod, int st, int dr)
{
if (st == dr)
{
arb[nod] -= val;
}
else
{
int mid = (st + dr) / 2;
if (pos <= mid)
{
update(2 * nod, st, mid);
}
else
{
update(2 * nod + 1, mid + 1, dr);
}
arb[nod] = arb[2*nod] + arb[2*nod+1];
}
}