#include <cstdio>
#include <algorithm>
using namespace std;
class ArboreDeIntervale{
private:
int sirCitit[100005];
int sir[400005];
int n;
int rezultat;
void construire(int x, int st, int dr)
{
if(st == dr)
{
sir[x] = sirCitit[st];
}
else
{
int m = (st + dr) / 2;
construire(x * 2, st, m);
construire(x * 2 + 1, m + 1, dr);
sir[x] = max(sir[x * 2], sir[x * 2 + 1]);
}
}
void querry(int st, int dr, int stx, int drx, int x)
{
if(st >= stx && dr <= drx)
{
rezultat = max(rezultat, sir[x]);
}
else
{
int m = (st + dr) / 2;
if(stx <= m)
{
querry(st, m, stx, drx, x * 2);
}
if(drx > m)
{
querry(m + 1, dr, stx, drx, x * 2 + 1);
}
}
}
void replace(int st, int dr, int x, int poz, int val)
{
if(st == dr)
{
sir[x] = val;
}
else
{
int m = (st + dr) / 2;
if(poz <= m)
{
replace(st, m, x * 2, poz, val);
}
else
{
replace(m + 1, dr, x * 2 + 1, poz, val);
}
sir[x] = max(sir[x * 2], sir[x * 2 + 1]);
}
}
public:
void construireArbore(int _n, int _sir[])
{
n = _n;
for(int i = 1; i <= n; i++)
{
sirCitit[i] = _sir[i];
}
construire(1, 1, n);
}
int gasireElementMaxim(int st, int dr)
{
rezultat = 0;
querry(1, n, st, dr, 1);
return rezultat;
}
void inlocuireValoare(int poz, int val)
{
replace(1, n, 1, poz, val);
}
}arbore;
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int sir[100005];
int n, m;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%d", &sir[i]);
}
arbore.construireArbore(n, sir);
int tmp1, tmp2, tmp3;
for(int k = 0; k < m; k++)
{
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
if(tmp1 == 0)
{
printf("%d\n", arbore.gasireElementMaxim(tmp2, tmp3));
}
else
{
arbore.inlocuireValoare(tmp2, tmp3);
}
}
return 0;
}