#include <stdio.h>
#include <values.h>
#define nmax 100666
#define infinit (MAXINT/2)
int max[nmax<<2], V[nmax];
int N, M;
int care(int l, int r)
{
return l > r? l: r;
}
void create(int node, int l, int r)
{
if (l == r)
max[node] = V[l];
else if (l < r)
{
int m = (l+r)>>1;
create(node<<1, l, m);
create(node<<1|1, m+1, r);
max[node] = care(max[node<<1], max[node<<1|1]);
}
}
int query(int node, int a, int b, int l, int r)
{
if (a <= l && r <= b)
return max[node];
else
{
int m = (l+r)>>1, maxim = -infinit;
if (a <= m)
maxim = care(maxim, query(node<<1, a, b, l, m));
if (b > r)
maxim = care(maxim, query(node<<1|1, a, b, m+1, r));
return maxim;
}
}
void insert(int node, int a, int b, int l, int r)
{
// a este pozitia
if (l == a && a == r)
max[node] = b;
else
{
int m = (l+r)>>1;
if (a <= m)
insert(node<<1, a, b, l, m);
else
insert(node<<1|1, a, b, m+1, r);
max[node]= care(max[node<<1], max[node<<1|1]);
}
}
int main()
{
int i, t, a, b;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i = 1; i <= N; ++i)
scanf("%d", &V[i]);
create(1, 1, N);
for (i = 1; i <= M; ++i)
{
scanf("%d%d%d", &t, &a, &b);
if (t == 0)
printf("%d\n", query(1, a, b, 1, N));
else
insert(1, a, b, 1, N);
}
return 0;
}