#include <stdio.h>
#define maxn 100001
int v[maxn];
int tree[4*maxn+50];
int max(int a, int b) {
return a < b ? b : a;
}
void build(int node, int left, int right) {
if(left == right) {
tree[node] = v[left];
}
else {
int mid = (left + right) / 2;
build(2*node, left, mid);
build(2*node+1, mid + 1, right);
tree[node] = max(tree[2*node], tree[2*node+1]);
}
}
void update(int node, int left, int right, int idx, int value) {
if(left == right) {
tree[node] = value;
}
else {
int mid = (left + right) / 2;
if(idx <= mid) {
update(2*node, left, mid, idx, value);
}
else {
update(2*node+1, mid+1, right, idx, value);
}
tree[node] = max(tree[2*node], tree[2*node+1]);
}
}
int query(int node, int left, int right, int x, int y) {
if(right < x || y < left) {
return -1;
}
if(x <= left && right <= y) {
return tree[node];
}
int mid = (left + right) / 2;
int q1 = query(2*node, left, mid, x, y);
int q2 = query(2*node+1, mid+1, right, x, y);
return max(q1, q2);
}
int main() {
FILE *input, *output;
input = fopen("arbint.in", "r");
output = fopen("arbint.out", "w");
int n, m;
fscanf(input, "%d %d", &n, &m);
for(int i=1;i<=n;i++) {
fscanf(input, "%d", &v[i]);
}
build(1, 1, n);
for(int i=0;i<m;i++) {
int op, a, b;
fscanf(input, "%d %d %d", &op, &a, &b);
if(op == 0) {
fprintf(output, "%d\n", query(1, 1, n, a, b));
}
else {
update(1, 1, n, a, b);
}
}
fclose(input);
fclose(output);
return 0;
}