#include <stdio.h>
#define MAX_N 400004
long long T[MAX_N];
long long Max;
int N, M;
void Init()
{
int i;
for ( i = 1; i < MAX_N; ++i )
T[i] = 0x3f3f3f3f;
}
void Update(int n, int st, int dr, int poz, long long v)
{
if(st == dr)
T[n] = v;
else
{
int m = (st + dr) >> 1;
if(poz <= m)
Update(n<<1, st, m, poz, v);
else
Update((n<<1)+1, m+1, dr, poz, v);
T[n] = T[n<<1] > T[(n<<1)+1] ? T[n<<1] : T[(n<<1)+1];
}
}
void Query(int n, int st, int dr, int a, int b)
{
if(st >= a && dr <= b)
Max = T[n] > Max ? T[n] : Max;
else
{
int m = (st + dr) >> 1;
if(a <= m) Query(n<<1, st, m, a, b);
if(b > m) Query((n<<1)+1, m+1, dr, a, b);
}
}
int main()
{
freopen("arbint.in", "rt", stdin);
freopen("arbint.out", "wt", stdout);
int i; long long v;
for ( scanf("%d %d", &N, &M), Init(), i = 1; i <= N; ++i )
{
scanf("%lld", &v);
Update(1, 1, N, i, v);
}
int op, a; long long b;
for ( i = 1; i <= M; ++i )
{
scanf("%d %d %lld", &op, &a, &b);
if(!op)
{
Max = 0;
Query(1, 1, N, a, b);
printf("%lld\n", Max);
}
else
Update(1, 1, N, a, b);
}
fclose(stdin);
fclose(stdout);
return 0;
}