#include <cstdio>
#include <algorithm>
#define DIM (1<<18)
#define INF (1<<30)
using namespace std;
int ArbInt[DIM], N, M, cod, X, Y;
int update (int node, int start, int finish, int left, int right, int value)
{
if(left <= start && finish <= right)
ArbInt[node] = value;
else {
int mid = start + ((finish - start) >> 1);
int value1 = -INF;
int value2 = -INF;
if(left <= mid)
value1 = update ((node << 1) , start , mid , left, right, value);
if(right > mid)
value2 = update ((node << 1) + 1, mid + 1, finish, left, right, value);
ArbInt[node] = max (ArbInt[(node << 1)], ArbInt[(node << 1) + 1]);
}
return ArbInt[node];
}
int query (int node, int start, int finish, int left, int right)
{
if (left <= start && finish <= right)
return ArbInt[node];
else {
int mid = start + ((finish - start) >> 1);
int value1 = -INF;
int value2 = -INF;
if (left <= mid)
value1 = query ((node << 1) , start , mid , left, right);
if (right > mid)
value2 = query ((node << 1) + 1, mid + 1, finish, left, right);
return max (value1, value2);
}
return -1;
}
int main()
{
freopen ("arbint.in" ,"r", stdin );
freopen ("arbint.out","w", stdout);
scanf ("%d %d", &N, &M);
for (int i = 1; i <= N; i ++)
{
scanf ("%d", &X);
update (1, 1, N, i, i, X);
}
for (int i = 1; i <= M; i ++)
{
scanf ("%d %d %d", &cod, &X, &Y);
switch (cod)
{
case 0: {
printf ("%d\n", query (1, 1, N, X, Y));
break;
}
case 1: {
update (1, 1, N, X, X, Y);
break;
}
}
}
fclose (stdin );
fclose (stdout);
return 0;
}