#include <cstdio>
#include <algorithm>
using namespace std;
int v[100005], aint[400005], sol;
void build(int nod, int st, int dr)
{
int m;
if(st == dr) aint[nod] = v[st];
else
{
m = (st + dr) / 2;
build(2 * nod, st, m);
build(2 * nod + 1, m + 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 m;
if(st == dr) aint[nod] = val;
else
{
m = (st + dr) / 2;
if(poz <= m) update(2 * nod, st, m, poz, val);
if(poz >= m + 1) update(2 * nod + 1, m + 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 m;
if(st1 <= st and dr <= dr1) sol = max(sol, aint[nod]);
else
{
m = (st + dr) / 2;
if(st1 <= m) query(2 * nod, st, m, st1, dr1);
if(dr1 >= m + 1) query(2 * nod + 1, m + 1, dr, st1, dr1);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int a, b, n, m;
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 < n; 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;
}