#include <fstream>
#define DMAX 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int A[4*DMAX],V[DMAX];
int n,M,a,b;
void build(int nod, int st, int dr);
void update(int nod, int st, int dr);
int query(int nod, int st, int dr);
int main()
{int i;
bool val;
fin>>n>>M;
for(i=1;i<=n;i++)
fin>>V[i];
build(1,1,n);
for(i=1;i<=M;i++)
{fin>>val>>a>>b;
if(val==0)
{
fout<<query(1,1,n)<<'\n';
}
else
update(1,1,n);
}
return 0;
}
void build(int nod, int st, int dr)
{int mij;
if(st==dr)
{
A[nod]=V[st];
return;
}
mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
A[nod]=max(A[2*nod],A[2*nod+1]);
}
int query(int nod, int st, int dr)
{int mij;
if(st>=a&&dr<=b)
return A[nod];
if(a>dr||b<st)
return 0;
mij=(st+dr)/2;
return max(query(2*nod,st,mij),query(2*nod+1,mij+1,dr));
}
void update(int nod,int st,int dr)
{int mij;
if(st==dr&&st==a)
{
A[nod]=b;
return;
}
if(st>a||dr<a)
return;
mij=(st+dr)/2;
update(2*nod,st,mij);
update(2*nod+1,mij+1,dr);
A[nod]=max(A[nod*2],A[nod*2+1]);
}