#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct tree{
tree* left;
tree* right;
long mx;
long mn;
};
long n, m;
long leafs[100001];
long nodes[400001];
void build(long nn, long l, long r){
if(l==r){
nodes[nn]=leafs[l];
}
else{
long m = (l+r)/2;
build(nn*2, l, m);
build((nn*2)+1, m+1, r);
nodes[nn] = max(nodes[nn*2], nodes[(nn*2)+1]);
}
}
long query(long nn, long l, long r, long ql, long qr){
if(ql<=l && r<=qr){
return nodes[nn];
}
int m=(l+r)/2;
if(qr<=m)
return query(nn*2, l, m, ql, qr);
if(m+1<=ql)
return query((nn*2)+1, m+1, r, ql, qr);
return max(query(nn*2, l, m, ql, qr), query((nn*2)+1, m+1, r, ql, qr));
}
void update(long nn, long l, long r, long pos, long rep){
if(l == pos && r == pos){
nodes[nn]=rep;
}
else{
long m=(l+r)/2;
if(pos<=m)
update(nn*2, l, m, pos, rep);
else{
update((nn*2)+1, m+1, r, pos, rep);
}
nodes[nn] = max(nodes[nn*2], nodes[(nn*2)+1]);
}
}
int main()
{
fin>>n>>m;
for(long i=1;i<=n;i++){
fin>>leafs[i];
}
build(1, 1, n);
int q, l, r;
for(long i=1;i<=m;i++){
fin>>q>>l>>r;
if(q==0){
fout<<query(1, 1, n, l, r)<<'\n';
}
else if(q==1){
update(1, 1, n, l, r);
}
}
return 0;
}