#include <fstream>
#include <cmath>
using namespace std;
void update(int index, int &val, int &pos, int left, int right, int tree[])
{
if (left == right)
tree[index] += val;
else
{
int middle = (left + right) >> 1;
if (pos <= middle)
update((index << 1) + 1, val, pos, left, middle, tree);
else
update((index << 1) + 2, val, pos, middle + 1, right, tree);
tree[index] += val;
}
}
int query(int index, int &left, int &right, int cLeft, int cRight, int tree[])
{
if (left <= cLeft && right >= cRight)
return tree[index];
int sum = 0, middle = (cLeft + cRight) >> 1;
if (middle >= left)
sum += query((index << 1) + 1, left, right, cLeft, middle, tree);
if (middle + 1 <= right)
sum += query((index << 1) + 2, left, right, middle + 1, cRight, tree);
return sum;
}
int main()
{
int i, N, M, x;
ifstream f("datorii.in");
f >> N >> M;
int length = (1 << ((int)log2(N) + 2)) - 1;
int tree[length];
fill(tree, tree + length, 0);
for (i = 0; i < N; i++)
{
f >> x;
update(0, x, i, 0, N - 1, tree);
}
int op, y;
ofstream g("datorii.out");
for (i = 0 ; i < M; i++)
{
f >> op >> x >> y;
if (op == 0)
{
y *= -1;
x--;
update(0, y, x, 0, N - 1, tree);
}
else if (op == 1)
{
x--;
y--;
g << query(0, x, y, 0, N - 1, tree) << '\n';
}
}
f.close();
g.close();
return 0;
}