# include <cstdio>
# include <algorithm>
using namespace std;
FILE *f = freopen("arbint.in", "r", stdin);
FILE *g = freopen("arbint.out", "w", stdout);
const int N_MAX = 100001;
int arb_int[4 * N_MAX];
int n, m, x, maxim;
void query(int nod, int start, int finish, int a, int b)
{
if (start >= a && b >= finish)
{
if (maxim < arb_int[nod])
maxim = arb_int[nod];
return ;
}
int left_son = nod << 1;
int right_son = (nod << 1) + 1;
int mij = (start + finish) / 2;
if (a <= mij)
query(left_son, start, mij, a, b);
if (b > mij)
query(right_son, mij+1, finish, a, b);
}
void update(int nod, int start, int finish, int a, int b)
{
if (start == finish)
{
arb_int[nod] = b;
return ;
}
int left_son = nod << 1;
int right_son = (nod << 1) + 1;
int mij = (start + finish) / 2;
if (a <= mij)
update(left_son, start, mij, a, b);
else
update(right_son, mij+1, finish, a, b);
arb_int[nod] = max(arb_int[left_son], arb_int[right_son]);
}
void read_and_solve()
{
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++)
{
scanf("%d", &x);
update(1, 1, n, i, x);
}
for (int i=1; i<=m; i++)
{
int t, a, b;
scanf("%d %d %d", &t, &a, &b);
if (t == 0)
{
maxim = 0;
query(1, 1, n, a, b);
printf("%d\n", maxim);
}
else
update(1, 1, n, a, b);
}
}
int main()
{
read_and_solve();
return 0;
}