#include <fstream>
#include <stdio.h>
#define maxim(a,b) ((a>b)?a:b)
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long long n,m,A[350009],to,a,b,i;
void update(int nod,int stanga,int dreapta,int poz,int val)
{
if(stanga==dreapta)
A[nod]=val;
else
{
int mij=(stanga+dreapta)/2;
if(poz<=mij)
update(2*nod,stanga,mij,poz,val);
else
update(2*nod+1,mij+1,dreapta,poz,val);
A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
}
int querry(int nod,int stanga,int dreapta,int a,int b)
{
if(a<=stanga && dreapta<=b)
return A[nod];
int mij=(stanga+dreapta)/2,i1=0,i2=0;
if(a<=mij) i1=querry(2*nod,stanga,mij,a,b);
if(b>mij) i2=querry(2*nod+1,mij+1,dreapta,a,b);
return maxim(i1,i2);
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>a;
update(1,1,n,i,a);
}
for(i=1;i<=m;i++)
{
f>>to>>a>>b;
if(!to)
{
g<<querry(1,1,n,a,b)<<'\n';
}
else
update(1,1,n,a,b);
}
f.close();
g.close();
return 0;
}