#include <cstdio>
#include <algorithm>
using namespace std;
int v[100005], aint[400005], sol, m;
void build(int nod, int st, int dr)
{
int med;
if(st == dr) aint[nod] = v[st];
else
{
med = (st + dr) / 2;
build(2 * nod, st, med);
build(2 * nod + 1, med + 1, dr);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void update(int nod, int st, int dr, int poz, int val)
{
int med;
if(st == dr) aint[nod] = val;
else
{
med = (st + dr) / 2;
if(poz <= med) update(2 * nod, st, med, poz, val);
if(poz >= med + 1) update(2 * nod + 1, med + 1, dr, poz, val);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void query(int nod, int st, int dr, int st1, int dr1)
{
int med;
if(st1 <= st and dr <= dr1) sol = max(sol, aint[nod]);
else
{
med = (st + dr) / 2;
if(st1 <= med) query(2 * nod, st, med, st1, dr1);
if(dr1 >= med + 1) query(2 * nod + 1, med + 1, dr, st1, dr1);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int a, b, n;
bool t;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%d", &v[i]);
}
build(1, 1, n);
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &t, &a, &b);
if(!t)
{
sol = 0;
query(1, 1, n, a, b);
printf("%d\n", sol);
}
if(t) update(1, 1, n, a, b);
}
return 0;
}