#include <iostream>
using namespace std;
#define maxN 100005
int sol;
int Aint[maxN * 3];
void update (int nod, int st, int dr, int a, int b)
{
if (st == dr)
{
Aint[nod] = b;
return;
}
int mid = (st + dr) / 2;
if (a <= mid) update (nod * 2, st, mid, a, b);
else update (nod * 2 + 1, mid + 1, dr, a, b);
Aint[nod] = max (Aint[nod * 2], Aint[nod * 2 + 1]);
}
void query (int nod, int st, int dr, int a, int b)
{
if (st >= a && dr <= b)
{
sol = max (sol, Aint[nod]);
return;
}
int mid = (st + dr) / 2;
if (mid >= a) query (nod * 2, st, mid, a, b);
if (mid < b) query (nod * 2 + 1, mid + 1, dr, a, b);
}
int main()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int N, M;
scanf ("%d %d", &N, &M);
for (int i = 1; i <= N; ++ i)
{
int A;
scanf ("%d", &A);
update (1, 1, N, i, A);
}
while (M --)
{
int type, a, b;
scanf ("%d %d %d", &type, &a, &b);
sol = 0;
if (! type)
{
query (1, 1, N, a, b);
printf ("%d \n", sol);
}
else update (1, 1, N, a, b);
}
return 0;
}