#include <bits/stdc++.h>
#define NMAX 100003
using namespace std;
int N, M, A[NMAX], T[4 * NMAX], S, E, pos;
int ans;
void build(int node, int st, int dr) {
if(st == dr) {
T[node] = A[st];
} else {
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void update(int node, int st, int dr) {
if(st == dr) {
T[node] = A[st];
} else {
int mid = (st + dr) / 2;
if(mid >= pos) {
update(2 * node, st, mid);
} else {
update(2 * node + 1, mid + 1, dr);
}
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void query(int node, int st, int dr) {
if(S <= st && dr <= E) {
ans = max(T[node], ans);
} else {
int mid = (st + dr) / 2;
if(S <= mid) {
query(2 * node, st, mid);
}
if (E > mid) {
query(2 * node + 1, mid + 1, dr);
}
}
}
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("%d", &A[i]);
}
build(1, 1, N);
for(int i = 1; i <= M; i++) {
int c, a, b;
scanf("%d %d %d", &c, &a, &b);
if(!c) {
ans = 0;
S = a;
E = b;
query(1, 1, N);
printf("%d\n", ans);
} else {
A[a] = b;
pos = a;
update(1, 1, N);
}
}
return 0;
}