#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX=(int)1e5+3;
class aint
{
int a[4*NMAX];
int v[NMAX];
public:
aint()
{
memset(a,0,sizeof(a));
}
void set(int *val, int n)
{
int i;
for(i=1;i<=n;i++)
{
v[i]=val[i];
}
}
void build(int node, int st, int dr)
{
if(st==dr)
{a[node]=v[st];return;}
build(2*node, st, (st+dr)/2);
build(2*node+1, (st+dr)/2+1,dr);
a[node]= max(a[2*node], a[2*node+1]);
}
void update(int node, int st, int dr,int poz, int value)
{
if(st==dr)
{
a[node]=value;return;
}
int mj=(st+dr)/2;
if( poz<=mj )
update(2*node, st,mj,poz,value);
else
update(2*node+1,mj+1,dr,poz,value);
a[node]= max(a[2*node],a[2*node+1]);
}
int query(int node, int st, int dr, int left, int right)
{
if( left<=st && dr<=right )
return a[node];
int mj=(st+dr)/2;
int rez1=0;
int rez2=0;
if( left<=mj )
rez1= query(2*node, st,mj, left,right);
if( right>mj )
rez2= query(2*node+1, mj+1,dr, left,right);
return max(rez1,rez2);
}
};
aint a;
int main()
{
int n,k;
int i;
int v[NMAX];
fin>>n>>k;
for(i=1;i<=n;i++)
{
fin>>v[i];
}
a.set(v,n);
a.build(1,1,n);
for(i=1;i<=k;i++)
{
int cer;
fin>>cer;
int x,y;
if(cer==0)
{
fin>>x>>y;
fout<< a.query(1,1,n,x,y)<<"\n";
}
else
{
fin>>x>>y;
a.update(1,1,n,x,y);
}
}
}