#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 nextInt(string &line, int &pos)
{
if (pos < line.size())
{
int n = 0;
while (line[pos] != ' ' && line[pos] != '\n')
n = n * 10 + (line[pos++] - '0');
pos++;
return n;
}
return -1;
}
int main()
{
int i, N, M, x;
ifstream f("datorii.in");
string line;
getline(f, line, '~');
line += ' ';
f.close();
int pos = 0;
N = nextInt(line, pos);
M = nextInt(line, pos);
int length = (1 << ((int)log2(N) + 2)) - 1;
int tree[length];
fill(tree, tree + length, 0);
for (i = 0; i < N; i++)
{
x = nextInt(line, pos);
update(0, x, i, 0, N - 1, tree);
}
int op, y;
ofstream g("datorii.out");
for (i = 0 ; i < M; i++)
{
op = nextInt(line, pos);
x = nextInt(line, pos);
y = nextInt(line, pos);
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;
}