#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, m, nr_el_baza;
vector<int> values, graf;
void build_graph(int node, int lf, int rg)
{
if (lf == rg && lf < n)
{
graf[node] = values[lf];
return;
}
else if (lf == rg)
{
graf[node] = 0;
return;
}
int med = (lf + rg) / 2;
build_graph(2 * node, lf, med);
build_graph(2 * node + 1, med + 1, rg);
graf[node] = graf[2 * node] + graf[2 * node + 1];
}
void set_constant()
{
int logar = log2(n);
if ((1 << logar) < n)
logar++;
nr_el_baza = (1 << logar);
}
int query(int q_lf, int q_rg, int node = 1, int lf = 0, int rg = nr_el_baza - 1)
{
int lfAns = 0, rgAns = 0;
if (q_lf <= lf && rg <= q_rg)
return graf[node];
int med = (lf + rg) / 2;
if (q_lf <= med)
lfAns = query(q_lf, q_rg, 2 * node, lf, med);
if (q_rg > med)
rgAns = query(q_lf, q_rg, 2 * node + 1, med + 1, rg);
return lfAns + rgAns;
}
void achitare(int val, int poz, int node = 1, int lf = 0, int rg = nr_el_baza - 1)
{
if (lf == rg)
{
graf[node] -= val;
return;
}
int med = (lf + rg) / 2;
if (poz <= med)
achitare(val, poz, 2 * node, lf, med);
else
achitare(val, poz, 2 * node + 1, med + 1, rg);
graf[node] -= val;
}
int main()
{
fin >> n >> m;
for (int i = 0; i < n; i++)
{
int val;
fin >> val;
values.push_back(val);
}
set_constant();
graf.resize(2 * nr_el_baza);
build_graph(1, 0, nr_el_baza - 1);
for (int i = 0; i < n; i++)
{
int op, t, v, p, q;
fin >> op;
if (op == 0)
{
fin >> t >> v;
t--;
achitare(v, t);
}
else
{
fin >> p >> q;
p--;
q--;
fout << query(p, q) << "\n";
}
}
return 0;
}