#include <fstream>
#define IN "arbint.in"
#define OUT "arbint.out"
#define NMAX 100005
using namespace std;
ifstream in(IN);
ofstream out(OUT);
int v[NMAX], nn, m, graf[2*NMAX], maxx;
inline void construieste(int n, int st, int dr)
{
if(st==dr)
graf[n]=v[st];
else
{
int mijl=(st+dr)/2;
construieste(2*n, st, mijl);
construieste(2*n+1, mijl+1, dr);
graf[n]=max(graf[2*n], graf[2*n+1]);
}
}
inline void verifica (int n, int st, int dr, int a, int b)
{
if(a<=st && b>=dr)
maxx=max(graf[n], maxx);
else
{
int mijl=(st+dr)/2;
if(a<=mijl)
verifica(2*n, st, mijl, a, b);
if(b>mijl)
verifica(2*n+1, mijl+1, dr, a, b);
}
}
inline void actualizare(int n, int st, int dr, int a, int b)
{
if(st==dr)
graf[n]=b;
else
{
int mijl=(st+dr)/2;
if(a<=mijl)
actualizare(2*n, st, mijl, a, b);
//if(b>mijl)
else
actualizare(2*n+1, mijl+1, dr, a, b);
graf[n]=max(graf[2*n], graf[2*n+1]);
}
}
int main()
{
int i, x, a, b;
in>>nn>>m;
for(i=1; i<=nn; ++i)
in>>v[i];
construieste(1, 1, nn);
for(i=1; i<=m; ++i)
{
in>>x>>a>>b;
if(x==0)
{
maxx=-1;
verifica(1, 1, nn, a, b);
out<<maxx<<'\n';
}
else
actualizare(1, 1, nn, a, b);
}
in.close();
out.close();
return 0;
}