=
#include<fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int arb[300000],a[100001];
void arbore(int index,int stanga,int dreapta)
{
if(stanga==dreapta)
{
arb[index]=a[stanga];
return;
}
int mijloc=(stanga+dreapta)/2;
arbore(2*index,stanga,mijloc);
arbore(2*index+1,mijloc+1,dreapta);
arb[index]=max(arb[index*2+1],arb[index*2]);
}
int maxim(int index,int stanga,int dreapta,int a,int b)
{
if(b<stanga || a>dreapta)
return 0;
if(a<=stanga && b>=dreapta)
return arb[index];
int mijloc=(stanga+dreapta)/2;
return max(maxim(2*index,stanga,mijloc,a,b),maxim(2*index+1,mijloc+1,dreapta,a,b));
}
void update(int index,int stanga,int dreapta,int val)
{
if(val<stanga||val>dreapta)
return;
if(stanga==dreapta)
{arb[index]=a[dreapta];
return;}
int mijloc=(stanga+dreapta)/2;
update(index*2,stanga,mijloc,val);
update(index*2+1,mijloc+1,dreapta,val);
arb[index]=max(arb[index*2],arb[index*2+1]);
}
int main() {
int N,Q;
cin>>N>>Q;
for(int i=1;i<=N;i++)
cin>>a[i];
arbore(1,1,N);
for(int i=1;i<=Q;i++)
{
int x,x1,x2;
cin>>x>>x1>>x2;
if(x==0)
{
cout<<maxim(1,1,N,x1,x2)<<"\n";
}
else{
a[x1]=x2;
update(1,1,N,x1);
}
}
}