#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int arb[100002];
int A[400002];
void Arb(int poz, int st, int dr)
{
if(st==dr) //sunt pe frunza
{
arb[poz]=A[st];
return;
}
else
{
int mijl=(st+dr)/2;
Arb(poz*2,st,mijl);
Arb(poz*2+1,mijl+1,dr);
arb[poz]=max(arb[poz*2], arb[poz*2+1]);
}
}
int Max(int poz, int pozstart, int pozfinal, int st,int dr)
{
if(st>=pozstart && pozfinal>=dr) //cu totul in interiorul intervalului
return arb[poz];
int mijl=(st+dr)/2;
int val1=-1,val2=-1;
if(pozstart<=mijl)
val1=Max(2*poz, pozstart, pozfinal, st, mijl);
if(mijl<pozfinal)
val2=Max(2*poz+1, pozstart, pozfinal, mijl+1, dr);
return max(val1,val2);
}
void Update(int poznod, int pozupdate,int val, int st, int dr)
{
if(st==dr)
{
arb[poznod]=val;
return;
}
else
{
int mijl=(st+dr)/2;
if(pozupdate<=mijl)
Update(poznod*2, pozupdate, val, st, mijl);
else
Update(poznod*2+1, pozupdate, val, mijl+1, dr);
arb[poznod]=max(arb[poznod*2], arb[poznod*2+1]);
}
}
int main()
{
int task,a,b;
fin>>n>>m;
for(int i=1; i<=n; ++i)
fin>>A[i];
Arb(1,1,n); //radacina pe pozitia 1
for(int i=0; i<m; ++i)
{
fin>>task>>a>>b;
if(task==0)
fout<<Max(1,a,b,1,n)<<"\n";
else
Update(1,a,b,1,n);
}
return 0;
}