#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
const int NMAX = 15e3 + 5;
int N, M, A[NMAX], V[4 * NMAX], dp[NMAX];
int Type, X, Y;
inline void Update (int Node, int a, int b, int pos, int val)
{
if(a == b)
{
V[Node] += val;
return;
}
int Mid = (a + b) / 2;
if(pos <= Mid)
Update(2 * Node, a, Mid, pos, val);
if(pos > Mid)
Update(2 * Node + 1, Mid + 1, b, pos, val);
V[Node] = V[2 * Node] + V[2 * Node + 1];
return;
}
inline int Query (int Node, int a, int b, int qa, int qb)
{
if(qa <= a && b <= qb)
return V[Node];
int Mid = (a + b) / 2;
int p1 = 0, p2 = 0;
if(qa <= Mid)
p1 = Query(2 * Node, a, Mid, qa, qb);
if(qb > Mid)
p2 = Query(2 * Node + 1, Mid + 1, b, qa, qb);
return (p1 + p2);
}
inline void Read ()
{
f.tie(NULL);
f >> N >> M;
for(int i = 1; i <= N; ++i)
f >> A[i];
return;
}
inline void Upload ()
{
for(int i = 1; i <= N; ++i)
dp[i] = dp[i - 1] + A[i];
return;
}
inline void Solve ()
{
while(M--)
{
f >> Type >> X >> Y;
if(Type == 0)
Update(1, 1, N, X, Y);
else
g << ((dp[Y] - dp[X - 1]) - Query(1, 1, N, X, Y)) << '\n';
}
return;
}
int main()
{
Read();
Upload();
Solve();
return 0;
}