#include<fstream>
std::ifstream fin("datorii.in");
std::ofstream fout("datorii.out");
const int MAX = 1.5e4 + 5;
int n, m;
int v[MAX], aint[4 * MAX];
void createAINT(int nod, int st, int dr) {
if (st == dr) {
aint[nod] = v[st];
}
else {
int m = (st + dr) / 2;
createAINT(2 * nod, st, m); //2 * nod = vecin din st
createAINT(2 * nod + 1, m + 1, dr); //2 * nod + 1 = vecin din dr
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
}
void update(int nod, int st, int dr, int poz, int x) {
if (st == dr) {
aint[nod] -= x;
}
else {
int m = (st + dr) / 2;
if (m < poz)
update(2 * nod + 1, m + 1, dr, poz, x);
else
update(2 * nod, st, m, poz, x);
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
}
int solve_query(int nod, int st, int dr, int a, int b) {
if (a <= st and dr <= b) {
return aint[nod];
}
else {
int m = (st + dr) / 2;
if (b <= m)
return solve_query(2 * nod, st, m, a, b);
if (m + 1 <= a)
return solve_query(2 * nod + 1, m + 1, dr, a, b);
return solve_query(2 * nod, st, m, a, b) + solve_query(2 * nod + 1, m + 1, dr, a, b);
}
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> v[i];
createAINT(1, 1, n);
int q, a, b;
while (m--) {
fin >> q >> a >> b;
if (q == 0)
update(1, 1, n, a, b);
else
fout << solve_query(1, 1, n, a, b) << '\n';
}
}