#include <fstream>
#include <iostream>
#define NMAX 400005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arbint[NMAX],n,q;
void update(int val, int poz, int nod, int st, int dr)
{
if(st==dr)
{
if(st==poz)
arbint[nod]=val;
return ;
}
else
{
if(poz<=(st+dr)/2 && st<=poz)
update(val,poz,2*nod,st,(st+dr)/2);
if(poz>=(st+dr)/2+1 && dr>=poz)
update(val,poz,2*nod+1,(st+dr)/2+1,dr);
}
arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
}
int query(int si, int fi, int nod, int st, int dr)
{
if(si<=st && dr<=fi)
return arbint[nod];
if(fi<=(st+dr)/2)
return query(si,fi,2*nod,st,(st+dr)/2);
if(si>(st+dr)/2)
return query(si,fi,2*nod+1,(st+dr)/2+1,dr);
return max(query(si,fi,2*nod,st,(st+dr)/2),query(si,fi,2*nod+1,(st+dr)/2+1,dr));
}
int main()
{
fin>>n>>q;
for(int i=1; i<=n; ++i)
{
int x;
fin>>x;
update(x,i,1,1,n);
}
while(q--)
{
int cer,a,b;
fin>>cer>>a>>b;
//cerr<<a<<" "<<b<<endl;
if(cer==0)
fout<<query(a,b,1,1,n)<<endl;
else
update(b,a,1,1,n);
}
}