#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int val[100005], arb[400005];
void build(int st, int dr, int nod)
{
if(st==dr)
{
arb[nod]=val[st];
}
else
{
int mij=(st+dr)/2;
build(st, mij, nod*2);
build(mij+1, dr, nod*2+1);
arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
}
void update(int st, int dr, int nod, int ind, int vall)
{
if(st==dr)
{
val[ind]=vall;
arb[nod]=vall;
}
else
{
int mij=(st+dr)/2;
if(ind<=mij) update(st, mij, nod*2, ind, vall);
else update(mij+1, dr, nod*2+1, ind, vall);
arb[nod]=max(arb[2*nod+1], arb[2*nod]);
}
}
int query(int st, int dr, int nod, int i, int f)
{
if(st>f || dr<i) return -1;
if(st>=i && dr<=f) return arb[nod];
int mij=(st+dr)/2;
int rez1=query(st, mij, nod*2, i, f);
int rez2=query(mij+1, dr, nod*2+1, i, f);
return max(rez1, rez2);
}
int main()
{
int n, m; fin >> n >> m;
for(int i=1; i<=n; i++) fin >> val[i];
build(1, n, 1);
for(int j=1; j<=m; j++)
{
int tip, a, b; fin >> tip >> a >> b;
if(tip==0) fout << query(1, n, 1, a, b) << "\n";
else update(1, n, 1, a, b);
}
return 0;
}