#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];
void construieste(int st, int dr, int poz)
{
if(st==dr)
{arb[poz]=a[st]; return;}
int mij=(st+dr)/2;
construieste(st, mij, 2*poz+1);
construieste(mij+1, dr, 2*poz+2);
arb[poz]=max(arb[2*poz+1], arb[2*poz+2]);
}
int cauta(int qst, int qdr, int st, int dr, int poz)
{
if(qst<=st&&dr<=qdr)
return arb[poz];
else
{
int mintemp=mini;
int mij=(st+dr)/2;
if(qst<=mij)
mintemp=max(mintemp, cauta(qst, qdr, st, mij, 2*poz+1));
if(qdr>mij)
mintemp=max(mintemp, cauta(qst, qdr, mij+1, dr, 2*poz+2));
return mintemp;
}
}
void update(int val, int qp, int st, int dr, int poz)
{
if(st==dr) {arb[poz]=val; return;}
int mij=(st+dr)/2;
if(qp<=mij)
update(val, qp, st, mij, 2*poz+1);
else
update(val, qp, mij+1, dr, 2*poz+2);
arb[poz]=max(arb[2*poz+1], arb[2*poz+2]);
return;
}
int main()
{
in>>n>>m;
for(int i=0; i<n; i++)
in>>a[i];
construieste(0, n-1, 0);
for(int i=1; i<=m; i++)
{
in>>op>>x>>y;
if(op==0)
out<<cauta(x-1, y-1, 0, n-1, 0)<<"\n";
else
update(y, x-1, 0, n-1, 0);
}
return 0;
}