#include <stdio.h>
#define MAX_N 15000
using namespace std;
FILE *fin = fopen("datorii.in", "r");
FILE *fout = fopen("datorii.out", "w");
int N, M;
int v[MAX_N + 1];
int arbint[4 * MAX_N + 1];
int maxim;
int MAX(int a, int b) {
return a > b ? a : b;
}
void build(int node, int left, int right) {
if (left == right) {
arbint[node] = v[left];
return;
}
int mid = (left + right) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
arbint[node] = arbint[node * 2] + arbint[node * 2 + 1];
}
void update(int node, int left, int right, int pos, int val) {
if (left == right) {
arbint[node] -= val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid) {
update(2 * node, left, mid, pos, val);
}
else {
update(2 * node + 1, mid + 1, right, pos, val);
}
arbint[node] = arbint[node * 2] + arbint[node * 2 + 1];
}
void querry(int node, int left, int right, int a, int b) {
if (a <= left && right <= b) {
maxim += arbint[node];
return;
}
int mid = (left + right) / 2;
if (a <= mid)
querry(node * 2, left, mid, a, b);
if (b > mid)
querry(node * 2 + 1, mid + 1, right, a, b);
}
int main(){
int i, j;
int type, a, b;
int sol;
fscanf(fin, "%d %d", &N, &M);
for (i = 1; i <= N; i++) {
fscanf(fin, "%d", &v[i]);
}
build(1, 1, N);
for (i = 1; i <= M; i++) {
fscanf(fin, "%d %d %d", &type, &a, &b);
if (type == 0) { /// b = valoare a = zi
update(1, 1, N, a, b);
}
else { /// suma de la a la b
maxim = 0;
if (a > b) {
int aux = a;
a = b;
b = aux;
}
querry(1, 1, N, a, b);
fprintf(fout, "%d\n", maxim);
}
}
fclose(fin);
fclose(fout);
return 0;
}