#include <iostream>
#include <cstdio>
using namespace std;
int vec[100005];
int arbint[400005];
void build(int v, int tl, int tr) {
if (tl == tr) {
arbint[v] = vec[tl];
} else {
int tm = (tl + tr) / 2;
build(v*2, tl, tm);
build(v*2+1, tm+1, tr);
arbint[v] = max(arbint[v*2], arbint[v*2+1]);
}
}
int maxim(int v, int tl, int tr, int l, int r) {
if (l > r)
return 0;
if (l == tl && r == tr) {
return arbint[v];
}
int tm = (tl + tr) / 2;
return max(maxim(v*2, tl, tm, l, min(r, tm)), maxim(v*2+1, tm+1, tr, max(l, tm+1), r));
}
void update(int v, int tl, int tr, int pos, int new_val) {
if (tl == tr) {
arbint[v] = new_val;
} else {
int tm = (tl + tr) / 2;
if (pos <= tm)
update(v*2, tl, tm, pos, new_val);
else
update(v*2+1, tm+1, tr, pos, new_val);
arbint[v] = max(arbint[v*2], arbint[v*2+1]);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out","w",stdout);
cin.tie(0); cin.sync_with_stdio(false);
cout.tie(0); cout.sync_with_stdio(false);
int n, m;
cin>>n>>m;
for (int i=1; i<=n; i++) cin>>vec[i];
build(1, 1, n);
for (int i=1; i<=m; i++) {
int c, a, b;
cin>>c>>a>>b;
if (c==0) {
cout<<maxim(1, 1, n, a, b)<<'\n';
}
if (c==1) {
update(1, 1, n, a, b);
}
}
return 0;
}