#include <cstdio>
#include <algorithm>
#define N 100001
using namespace std;
int H[3 * N], v[N], n, m;
void build(int node, int L, int R){
int M = (L + R) / 2;
if(L == R)
H[node] = v[L];
else{
build(node * 2, L, M);
build(node * 2 + 1, M + 1, R);
H[node] = max(H[node * 2], H[node * 2 + 1]);
}
}
void update(int node, int L, int R, int pos, int val){
int M = (L + R) / 2;
if(L == R)
H[node] = val;
else{
if(pos <= M)
update(node * 2, L, M, pos, val);
else
update(node * 2 + 1, M + 1, R, pos, val);
H[node] = max(H[node * 2], H[node * 2 + 1]);
}
}
int query(int node, int L, int R, int ql, int qr){
if(ql <= L && qr >= R)
return H[node];
int M = (L + R) / 2, maxi = 0;
if(ql <= M)
maxi = max(query(node * 2, L, M, ql, qr), maxi);
if(qr > M)
maxi = max(query(node * 2 + 1, M + 1, R, ql, qr), maxi);
return maxi;
}
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 ", &v[i]);
build(1, 1, n);
for(int i = 1; i <= m; ++i){
int ok, a, b;
scanf("%d %d %d", &ok, &a, &b);
if(ok)
update(1, 1, n, a, b);
else
printf("%d\n", query(1, 1, n, a, b));
}
}