#include <iostream>
#include <fstream>
using namespace std;
#define nmax 100005
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[nmax],arbore[4*nmax],maxim,n,m;
void build(int nod,int poz,int val,int st,int dr)
{
int mid=(st+dr)/2;
if (st==poz&&st==dr)
{
arbore[nod]=val;
return;
}
if (poz<=mid)
build(nod*2,poz,val,st,mid);
else
build(nod*2+1,poz,val,mid+1,dr);
arbore[nod]=max(arbore[nod*2],arbore[nod*2+1]);
}
void query(int nod,int x,int y,int st,int dr)
{
int mid=(st+dr)/2;
if (st>=x&&dr<=y)
{
maxim=max(maxim,arbore[nod]);
}
if (st>y||dr<x||st==dr)
return;
query(nod*2,x,y,st,mid);
query(nod*2+1,x,y,mid+1,dr);
}
int main()
{
f>>n>>m;
for (int i=1; i<=n; ++i)
{
f>>v[i];
build(1,i,v[i],1,n);
}
for (int i=1; i<=m; ++i)
{
int x1,x2,x3;
f>>x1>>x2>>x3;
if (x1==1)
build(1,x2,x3,1,n);
else
{
maxim=0;
query(1,x2,x3,1,n);
g<<maxim<<'\n';
}
}
return 0;
}