#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
int n, m, i, sol, A[200003], a, b, c;
void build(int nod, int st, int dr){
if(st==dr){
fin>>A[nod];
}
else
if(st <= dr){
int mid = (st + dr) / 2;
build(2*nod, st, mid);
build(2*nod+1, mid+1, dr);
A[nod]=max(A[2*nod], A[2*nod+1]);
}
}
int query(int nod, int st, int dr, int a, int b){
if(a<=st && b>=dr){
sol=max(sol, A[nod]);
}
else{
int mid = (st + dr) / 2;
if(a<=mid)
query(2*nod, st, mid, a, b);
else
if(dr>mid)
query(2*nod+1, mid+1, dr, a, b);
}
return sol;
}
void update(int nod, int st, int dr, int a, int b){
if(st==dr && st==a){
A[nod]=b;
}
else
if(st <= dr){
int mid = (st + dr) / 2;
if(a<=mid)
update(2*nod, st, mid, a, b);
else
if(a>mid)
update(2*nod+1, mid+1, dr, a, b);
A[nod]=max(A[2*nod], A[2*nod+1]);
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=2*n-1;i++){
A[i]=2000000000;
}
build(1, 1, n);
for(i=1;i<=m;i++){
sol=-1;
fin>>c>>a>>b;
if(c==0){
fout<<query(1, 1, n, a, b)<<'\n';
}
else{
update(1, 1, n, a, b);
}
}
return 0;
}