#include <cstdio>
const int N = 100006;//100001
const int ARB = 1<<18;//putere 2 min > N
const int INF = 2000000000;
int v[N],n;
int arb[ARB]; int poz_frunza[N];
int max(int a, int b)
{
return (a>b)?a:b;
}
void gasire_frunze(int st, int dr, int poz)
{
int mij;
if (st == dr)
{
poz_frunza[st] = poz;
return;
}
mij = (st+dr)/2;
gasire_frunze(st,mij,2*poz);
gasire_frunze(mij+1,dr,2*poz+1);
}
void actualizare_valoare(int i, int val)
{
int poz = poz_frunza[i];
arb[poz] = val;
for (poz /= 2; poz >= 1; poz /= 2)
arb[poz] = max(arb[2*poz],arb[2*poz+1]);
}
int query(int st, int dr, int poz, int x, int y)
{
if ((x <= st)&&(dr <= y))//intervalul [st,dr] este folosit in intregime la raspundere
return arb[poz];
if ((dr < x)||(y < st))//intervalul [st,dr] este complet inutil in raspunderea pt intervalul [a,b];
return -INF;
int mij = (st+dr)/2;
return max(query(st,mij,2*poz,x,y),query(mij+1,dr,2*poz+1,x,y));
}
int interogare(int a, int b)
{
return query(1,n,1,a,b);
}
void citire_si_rezolvare()
{
int q,op,x,y;
scanf("%d%d",&n,&q);
gasire_frunze(1,n,1);
for (int i = 1; i <= n; ++i)
{
scanf("%d",&v[i]);
actualizare_valoare(i,v[i]);
}
for (int i = 1; i <= q; ++i)
{
scanf("%d%d%d",&op,&x,&y);
if (op == 0)
printf("%d\n",interogare(x,y));
else
actualizare_valoare(x,y);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire_si_rezolvare();
return 0;
}