#include <cstdio>
#define maxn 15001
FILE *in = fopen("datorii.in","r"), *out = fopen("datorii.out","w");
int n, m;
int b[maxn]; // AIB
int query(int x)
{
int r = 0;
while ( x )
r += b[x], x -= x^(x-1)&x;
return r;
}
void update(int x, int val)
{
while ( x <= n )
b[x] += val, x += x^(x-1)&x;
}
void goAIB()
{
int a, c, d;
for ( int i = 1; i <= n; ++i )
fscanf(in, "%d", &a), update(i, a);
for ( int i = 1; i <= m; ++i )
{
fscanf(in, "%d %d %d", &a, &c, &d);
if ( a )
fprintf(out, "%d\n", query(d) - query(c-1));
else
update(c, -d);
}
}
//
//int a[maxn];
//int arb[(2<<13)+1];
//
//void build(int nod, int st, int dr)
//{
// if ( st == dr )
// {
// arb[nod] = a[st];
// return;
// }
//
// int m = (st + dr) >> 1;
// int q = nod << 1;
//
// build(q, st, m);
// build(q+1, m+1, dr);
//
// arb[nod] = arb[q] + arb[q+1];
//}
//
//int p;
//void updatex(int nod, int st, int dr)
//{
// if ( st == dr )
// {
// arb[nod] = a[st];
// return;
// }
//
// if ( p < st || p > dr )
// return;
//
// int m = (st + dr) >> 1;
// int q = nod << 1;
//
// updatex(q, st, m);
// updatex(q+1, m+1, dr);
//
// arb[nod] = arb[q] + arb[q+1];
//}
//
//int r = 0, p1, p2;
//void queryx(int nod, int st, int dr)
//{
// if ( p1 <= st && dr <= p2 )
// {
// r += arb[nod];
// return;
// }
//
// int m = (st + dr) >> 1;
// int q = nod << 1;
//
// if ( st == dr )
// return;
//
// queryx(q, st, m);
// queryx(q+1, m+1, dr);
//}
//
//void goAdeIntervale()
//{
// for ( int i = 1; i <= n; ++i )
// fscanf(in, "%d", &a[i]);
//
// build(1, 1, n);
//
// int op, t, d;
// for ( int i = 1; i <= m; ++i )
// {
// fscanf(in, "%d %d %d", &op, &t, &d);
// if ( op == 0 )
// a[t] -= d, p = t, updatex(1, 1, n);
// else
// r = 0, p1 = t, p2 = d, queryx(1, 1, n), fprintf(out, "%d\n", r);
// }
//}
int main()
{
fscanf(in, "%d %d", &n, &m);
//goAdeIntervale();
goAIB();
return 0;
}