#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("arbint.in");
ofstream out("arbint.out");
const int mini=-1;
int arb[263000], m, n, op, x, y;
int a[100010];
int construieste(int st, int dr, int poz)
{
if(st>dr)
return mini;
if(st==dr)
return arb[poz]=a[st];
int mij=(st+dr)/2;
return arb[poz]=max(construieste(st, mij, 2*poz), construieste(mij+1, dr, 2*poz+1));
}
int cauta(int qst, int qdr, int st, int dr, int poz)
{
if(st>qdr||dr<qst||st>dr)
return mini;
if(qst<=st&&dr<=qdr)
return arb[poz];
int mij=(st+dr)/2;
return max(cauta(qst, qdr, st, mij, 2*poz), cauta(qst, qdr, mij+1, dr, 2*poz+1));
}
void update(int val, int qp, int st, int dr, int poz)
{
if(st>dr) return;
if(st==dr&&st==qp) {arb[poz]=val; return;}
else if(st==dr) return;
int mij=(st+dr)/2;
update(val, qp, st, mij, 2*poz);
update(val, qp, mij+1, dr, 2*poz+1);
arb[poz]=max(arb[2*poz], arb[2*poz+1]);
return;
}
int main()
{
in>>n>>m;
for(int i=1; i<=n; i++)
in>>a[i];
construieste(1, n, 1);
for(int i=1; i<=m; i++)
{
in>>op>>x>>y;
if(op==0)
out<<cauta(x, y, 1, n, 1)<<"\n";
else
update(y, x, 1, n, 1);
}
return 0;
}