#include <fstream>
#include <stdint.h>
#define nmax 100001
using namespace std;
fstream f1("arbint.in", ios::in);
fstream f2("arbint.out", ios::out);
int32_t n, m, aint[nmax*4], v[nmax], maxi=0;
void citire()
{
int32_t i;
f1>>n>>m;
for(i=1; i<=n; i++)
f1>>v[i];
}
void creare(int32_t poz, int32_t st, int32_t dr)
{
if(st<dr)
{
int32_t max1, max2, mijl;
mijl=(st+dr)/2;
creare(poz*2, st, mijl);
creare(poz*2+1, mijl+1, dr);
max1=aint[2*poz];
max2=aint[2*poz+1];
if(max1>max2) aint[poz]=max1;
else aint[poz]=max2;
}
else if(st==dr) aint[poz]=v[st];
}
int32_t maxim(int32_t poz, int32_t x, int32_t y, int32_t a, int32_t b)
{
if((a<=x)&&(y<=b)) {if(maxi<aint[poz]) maxi=aint[poz];return maxi;}
else
{
int32_t mijl=(x+y)/2;
if(a<=mijl) return maxim(2*poz, x, mijl, a, b);
if(mijl+1<=b)return maxim(2*poz+1, mijl+1, y, a, b);
}
}
void actualizare(int32_t poz, int32_t st, int32_t dr, int32_t sc, int32_t val)
{
if(st<dr)
{
int32_t mijl=(st+dr)/2;
if(sc<=mijl) actualizare(2*poz, st, mijl, sc, val);
else actualizare(2*poz+1, mijl+1, dr, sc, val);
if(aint[2*poz]>aint[2*poz+1]) aint[poz]=aint[2*poz];
else aint[poz]=aint[2*poz+1];
}
else if((st==dr)&&(sc==st)) aint[poz]=val;
}
void intrebari()
{
int32_t i, v, a, b;
for(i=1; i<=m; i++)
{
maxi=0;
f1>>v>>a>>b;
if(v==0) {f2<<maxim(1, 1, n, a, b)<<"\n";}
else {actualizare(1, 1, n, a, b);}
}
}
int main()
{
citire();
creare(1, 1, n);
intrebari();
return 0;
}