#include <stdio.h>
#include <stdlib.h>
#define MAX 15005
typedef struct{
int s, d, info;
} TArb;
void constr(TArb* arb, int* v, int s, int d, int i);
int query(TArb* arb, int a, int b, int i);
void update(TArb* arb, int a, int b, int i);
int main(){
freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);
int n, m, i, v[MAX], nr, k = 1, x, a, b;
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i++)
scanf("%d", &v[i]);
nr = 2 * n + 5;
while(nr > 0){
nr /= 2;
k *= 2;
}
TArb* arb = (TArb*)calloc(k + 1, sizeof(TArb));
if(!arb) return 0;
constr(arb, v, 1, n, 1);
for(i = 0; i < m; i++){
scanf("%d%d%d", &x, &a, &b);
if(x == 1)
printf("%d\n", query(arb, a, b, 1));
else
update(arb, a, b, 1);
}
free(arb);
return 0;
}
void constr(TArb* arb, int* v, int s, int d, int i){
arb[i].s = s;
arb[i].d = d;
if(s == d){
arb[i].info = v[s];
return;
}
int mij = (s + d) / 2;
constr(arb, v, s, mij, 2 * i);
constr(arb, v, mij + 1, d, 2 * i + 1);
arb[i].info = arb[2 * i].info + arb[2 * i + 1].info;
}
int query(TArb* arb, int a, int b, int i){
if(a <= arb[i].s && arb[i].d <= b)
return arb[i].info;
int mij = (arb[i].s + arb[i].d) / 2, x = 0, y = 0;
if(a <= mij)
x = query(arb, a, b, 2 * i);
if(b > mij)
y = query(arb, a, b, 2 * i + 1);
return x + y;
}
void update(TArb* arb, int a, int b, int i){
if(arb[i].s == arb[i].d && arb[i].s == a){
arb[i].info -= b;
return;
}
int mij = (arb[i].s + arb[i].d) / 2;
if(a <= mij)
update(arb, a, b, 2 * i);
else
update(arb, a, b, 2 * i + 1);
arb[i].info = arb[2 * i].info + arb[2 * i + 1].info;
}