#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m;
int v[100005];
int aint[200005];
void build(int poz,int st,int dr)
{
if(st==dr)
{
aint[poz]=v[st];
return;
}
int mij=(st+dr)/2;
build(2*poz,st,mij);
build(2*poz+1,mij+1,dr);
if(aint[2*poz]<aint[2*poz+1])
aint[poz]=aint[2*poz+1];
else
aint[poz]=aint[2*poz];
}
void update(int poz,int st,int dr,int id,int val)
{
if(st==dr)
{
aint[poz]=val;
return;
}
int mij=(st+dr)/2;
if(id<=mij)
update(2*poz,st,mij,id,val);
else
update(2*poz+1,mij+1,dr,id,val);
aint[poz]=max(aint[2*poz],aint[2*poz+1]);
}
int query(int poz,int st,int dr,int qst,int qdr)
{
if(qst<=st and dr<=qdr)
return aint[poz];
int mij=(st+dr)/2;
if(qst<=mij)
{
if(qdr>mij)//avem 2 de facut deci
return max(query(2*poz,st,mij,qst,mij),query(2*poz+1,mij+1,dr,qst,qdr));
else
return query(2*poz,st,mij,qst,qdr);
}
else
return query(2*poz+1,mij+1,dr,qst,qdr);
}
int main()
{
int i,t,j,z,k=1,tip,ii,a,b;
f>>n>>m;
for(i=1;i<=n;i++)
f>>v[i];
build(1,1,n);
for(i=1;i<=m;i++)
{
f>>tip;
f>>a>>b;
if(tip==0)
{
g<<query(1,1,n,a,b)<<'\n';
}
else
{
update(1,1,n,a,b);
}
}
return 0;
}