#include <bits/stdc++.h>
#define MAX 1000000
///COMPLETE SEGMENT TREE WITH BONUS LAZY UPDATE
int v[MAX], tree[MAX], lazy[MAX];
void build_tree(int node, int a, int b) {
if(a > b)
return;
if(a == b) {
tree[node] = v[a];
return;
}
build_tree(node * 2, a, (a + b) / 2);
build_tree(node *2 + 1, (a + b) / 2 + 1, b);
tree[node] = std::max(tree[node * 2], tree[node * 2 + 1]);
}
void update_tree(int node, int a, int b, int i, int j, int value) {
if(lazy[node]) {
tree[node] += lazy[node];
if(a != b) {
lazy[node * 2] += tree[node];
lazy[node * 2 + 1] += tree[node];
}
lazy[node] = 0;
}
if(a > b || a > j || b < i)
return;
if(a >= i && b <= j) {
// tree[node] += value;
tree[node] += value;
if(a != b) {
lazy[node * 2] += value;
lazy[node * 2 + 1] += value;
}
return;
}
update_tree(node *2, a, (a + b) / 2, i, j, value);
update_tree(node * 2 + 1, (a + b) / 2 + 1, b, i, j, value);
tree[node] = std::max(tree[node * 2], tree[node * 2 + 1]);
}
int query_tree(int node, int a, int b, int i, int j) {
if(a > b || a > j || b < i)return INT_MIN;
if(lazy[node] != 0) {
tree[node] += lazy[node];
if(a != b) {
lazy[node * 2] += lazy[node];
lazy[node * 2 + 1] += lazy[node];
}
lazy[node] = 0;
}
if(a >= i && b <= j)
return tree[node];
int q1 = query_tree(node * 2 + 1, (a + b) / 2 + 1, b, i, j);
int q2 = query_tree(node * 2, a, (a + b) / 2, i, j);
int res = std::max(q1, q2);
return res;
}
FILE *fin, *fout;
int main() {
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
int n, m;
fscanf(fin, "%d%d", &n, &m);
int i, cer, a, b;
for(i = 0;i < n;i++)
fscanf(fin, "%d", &v[i]);
build_tree(1, 0, n - 1);
memset(lazy, 0, sizeof(lazy));
for(i = 0;i < m;i++) {
fscanf(fin, "%d%d%d", &cer, &a, &b);
// for(int j = 0;j < n;j++)
// printf("%d ", v[j]);
// printf("\n");
// printf("%d ", cer);
if(cer == 1) {
a--;
int quer;
quer = query_tree(1, 0, n - 1, a, a);
update_tree(1, 0, n - 1, a, a, b - quer);
}
else {
b--;
a--;
int q;
q = query_tree(1, 0, n - 1, a, b);
fprintf(fout, "%d\n", q);
}
}
fclose(fin);
fclose(fout);
return 0;
}