#include <stdio.h>
#include <values.h>
#define nmax 500000
#define infinit (MAXINT/2)
int max[nmax], A[nmax], N, M;
void create(int node, int i, int j)
{
if (i == j)
{
max[node] = A[i];
return;
}
int m = (i+j)>>1;
create(node<<1, i, m);
create(node<<1|1, m+1, j);
max[node] = max[node<<1]>max[node<<1|1]?max[node<<1]:max[node<<1|1];
}
int maximm(int node, int i, int j, int a, int b)
{
if (i <= a && b <= j)
return max[node];
int m = (a+b)>>1, maxim = -infinit, news;
if (i <= m)
{
news = maximm(node<<1, i, j, a, m);
if (news > maxim)
maxim = news;
}
if (j > m)
{
news = maximm(node<<1|1, i, j, m+1, b);
if (news > maxim)
maxim = news;
}
return maxim;
}
void update(int node, int i, int j, int a, int b, int value)
{
if (i <= a && b <= j)
{
max[node] = value;
return;
}
int m = (a+b)>>1;
if (i <= m)
update(node<<1, i, j, a, m, value);
if (j > m)
update(node<<1|1, i, j, m+1, b, value);
max[node] = max[node<<1]>max[node<<1|1]?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", &A[i]);
create(1, 1, N);
for (i = 1; i <= M; ++i)
{
scanf("%d%d%d", &t, &a, &b);
if (t == 0)
printf("%d\n", maximm(1, a, b, 1, N));
else
update(1, a, a, 1, N, b);
}
return 0;
}