#include <fstream>
using namespace std;
ifstream in ("datorii.in");
ofstream out ("datorii.out");
const int NMAX = 15000;
int aint[1+4*NMAX];
int v[1 + NMAX];
void build (int indexNod, int st, int dr)
{
if (st == dr)
{
aint[indexNod] = v[st];
return;
}
int indexFiuSt = 2 * indexNod;
int indexFiuDr = 2 * indexNod + 1;
int mij = (st+ dr) / 2;
build(indexFiuSt, st, mij);
build(indexFiuDr, mij+1 , dr);
aint[indexNod] = aint[indexFiuSt] + aint[indexFiuDr];
}
void update(int indexNod, int st, int dr, int poz, int val)
{
if(st == dr)
{
aint[indexNod] -= val;
return;
}
int indexFiuSt = 2 * indexNod;
int indexFiuDr = 2 * indexNod + 1;
int mij = (st + dr)/2;
if(poz <= mij)
update(indexFiuSt, st, mij, poz, val);
else
update(indexFiuDr, mij + 1, dr, poz, val);
aint[indexNod] -= val;
}
int query(int indexNod, int st, int dr, int stQuery, int drQuery)
{
if( stQuery == st && drQuery == dr)
{
return aint[indexNod];
}
int indexFiuSt = 2 * indexNod;
int indexFiuDr = 2 * indexNod + 1;
int mij = (st + dr)/2;
if (drQuery <= mij)
return query(indexFiuSt, st, mij, stQuery, drQuery);
else if(stQuery >= mij + 1)
return query(indexFiuDr, mij + 1, dr, stQuery, drQuery);
else
return query(indexFiuSt, st, mij, stQuery, mij) + query(indexFiuDr, mij + 1, dr, mij + 1, drQuery);
}
int main()
{
int n, m;
in >> n >> m;
for(int i = 1; i<= n; i++)
{
in >> v[i];
}
build(1,1,n);
for( int j = 1; j <= m; j++)
{
int tipOperatie, a, b;
in >> tipOperatie >> a >> b;
if (tipOperatie == 0)
{
update(1, 1, n, a, b);
}
else
{
out << query(1, 1, n, a, b) << '\n';
}
}
return 0;
}