#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define NMax 103
int N, M;
long v[NMax];
long T[4 * NMax];
void build(int l, int r, int index) {
if(l == r) {
T[index] = v[l];
return;
}
int mid = (l + r) / 2;
build(l, mid, 2 * index);
build(mid + 1, r, 2 * index + 1);
T[index] = max(T[2 * index], T[2 * index + 1]);
}
long get(int l, int r, int index, int a, int b) {
if(l == a && r == b) {
return T[index];
}
int mid = (l + r) / 2;
if(b <= mid) {
return get(l, mid, 2 * index, a, b);
}
if(a >= mid + 1) {
return get(mid + 1, r, 2 * index + 1, a, b);
}
long l_res = get(l, mid, 2 * index, a, mid);
long r_res = get(mid + 1, r, 2 * index + 1, mid + 1, b);
return max(l_res, r_res);
}
void update(int l, int r, int index, int a, int b) {
if(l == r) {
T[index] = b;
return;
}
int mid = (l + r) / 2;
if(a <= mid) {
update(l, mid, 2 * index, a, b);
T[index] = max(T[2 * index], T[2 * index + 1]);
return;
}
else {
update(mid + 1, r, 2 * index + 1, a, b);
T[index] = max(T[2 * index], T[2 * index + 1]);
return;
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; i++) {
scanf("%ld ", &v[i]);
}
build(1, N, 1);
for(int i = 1; i <= M; i++) {
int task, a, b;
scanf("%d %d %d", &task, &a, &b);
if(task == 0) {
printf("%ld\n", get(1, N, 1, a, b));
}
if(task == 1) {
update(1, N, 1, a, b);
}
}
/*for(int i = 1; i <= 4 * N; i++) {
printf("%ld ", T[i]);
}*/
return 0;
}