#include <stdio.h>
#include <stdlib.h>
FILE *f, *g;
void createSegmentTree(int node, int left, int right, int *arr, int *sgmTree) {
if (left == right) {
fscanf(f, "%d", &arr[left]);
sgmTree[node] = arr[left];
} else {
int mid = (left + right) / 2;
createSegmentTree(2 * node, left, mid, arr, sgmTree);
createSegmentTree(2 * node + 1, mid + 1, right, arr, sgmTree);
sgmTree[node] = sgmTree[2 * node] + sgmTree[2 * node + 1];
}
}
int getSum(int node, int left, int right, int leftSegment, int rightSegment, int* sgmTree) {
if (leftSegment <= left && right <= rightSegment) {
return sgmTree[node];
} else {
int leftMaximum = 0;
int rightMaximum = 0;
int mid = (left + right) / 2;
if (mid >= leftSegment) {
leftMaximum = getSum(2 * node, left, mid, leftSegment, rightSegment, sgmTree);
}
if (mid + 1 <= rightSegment) {
rightMaximum = getSum(2 * node + 1, mid + 1, right, leftSegment, rightSegment, sgmTree);
}
return (leftMaximum + rightMaximum);
}
}
void setValue(int node, int left, int right, int pos, int value, int* arr, int *sgmTree) {
if (left == right) {
arr[left] = value;
sgmTree[node] = value;
} else {
int mid = (left + right) / 2;
if (pos <= mid) {
setValue(2 * node, left, mid, pos, value, arr, sgmTree);
} else {
setValue(2 * node + 1, mid + 1, right, pos, value, arr, sgmTree);
}
sgmTree[node] = sgmTree[2 * node] + sgmTree[2 * node + 1];
}
}
int main() {
f = fopen("datorii.in", "r");
g = fopen("datorii.out", "w");
int n, m;
fscanf(f, "%d %d", &n, &m);
int *arr = (int*) malloc(n * sizeof(int));
int *sgmTree = (int*) malloc(4 * n * sizeof(int));
createSegmentTree(1, 0, n - 1, arr, sgmTree);
int i;
for (i = 0; i < m; ++i) {
int type, a, b;
fscanf(f, "%d %d %d", &type, &a, &b);
if (type == 1) {
a --;
b --;
fprintf(g, "%d\n", getSum(1, 0, n - 1, a, b, sgmTree));
} else {
a --;
int diff = arr[a] - b;
setValue(1, 0, n - 1, a, diff, arr, sgmTree);
}
}
return 0;
}