#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int v[(1<<18)+8];
void update(int nod, int st, int dr, int &x, int &i)
{
if(st==dr)
v[nod]=x;
else
{
if(i<=(st+dr)/2)
update(2*nod,st,(st+dr)/2,x,i);
else
update(2*nod+1,(st+dr)/2+1,dr,x,i);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
}
int querry(int nod, int st, int dr, int &a, int &b)
{
if(a <=st && dr<= b)
return v[nod];
else
{
if(a<=(st+dr)/2 && b>=(st+dr)/2+1)
return max(querry(nod*2,st,(st+dr)/2,a,b),querry(nod*2+1,(st+dr)/2+1,dr,a,b));
else if(a<=(st+dr)/2)
return querry(nod*2,st,(st+dr)/2,a,b);
else
return querry(nod*2+1,(st+dr)/2+1,dr,a,b);
}
}
void citire()
{
fin>>n>>m;
int i,x;
for(i=1;i<=n;i++)
{
fin>>x;
update(1,1,n,x,i);
}
}
void rezolvare()
{
int i,op,a,b;
for(i=1;i<=m;i++)
{
fin>>op>>a>>b;
if(op==1)
update(1,1,n,b,a);
else
fout<<querry(1,1,n,a,b)<<'\n';
}
}
int main()
{
citire();
rezolvare();
return 0;
}