#include<fstream>
using namespace std;
#define NMAX 1000010
const char infile[]="arbint.in";
const char outfile[]="arbint.out";
long long A[NMAX];
int N;
void update(int indice,int stanga,int dreapta,int a,int b,long long x)
{
if(a<=stanga && dreapta <=b)
{
A[indice]=x;
}
else
{
int mij=(stanga+dreapta)/2;
if (a<=mij)
{
update(indice*2,stanga,mij,a,b,x);
}
if(mij<b)
{
update(indice*2+1,mij+1,dreapta,a,b,x);
}
A[indice]= A[indice*2] > A[indice*2+1] ? A[indice *2] : A[indice*2+1];
}
}
long long query(int indice,int stanga,int dreapta,int a,int b)
{
if( a<= stanga && dreapta <= b)
return A[indice];
else
{
long long x,y;
x=y=0;
int mij=(stanga+dreapta)/2;
if( a<=mij)
{
x=query(indice*2,stanga,mij,a,b);
}
if( b>mij)
{
y=query(indice*2+1,mij+1,dreapta,a,b);
}
return x > y ? x : y;
}
}
void citire()
{
int M;
fstream fin(infile,ios::in);
fstream fout(outfile,ios::out);
fin>>N>>M;
int x;
for(int i=1;i<=N;i++)
{
fin>>x;
update(1,1,N,i,i,x);
}
int y,z;
long long t;
for(int i=1;i<=M;i++)
{
fin>>x;
switch(x)
{
case(0):
fin>>y>>z;
fout<<query(1,1,N,y,z)<<"\n";
break;
case(1):
fin>>y>>t;
update(1,1,N,y,y,t);
break;
}
}
fin.close();
fout.close();
}
int main()
{
citire();
}