#include <stdio.h>
int A[500001];
int max, position, value;
void insert(int l, int r, int node)
{
if(l == r)
{
A[node] = value;
}
else
{
int middle = (r - l)/ 2 + l;
if(position <= middle) insert(l, middle, 2 * node);
else insert(middle + 1, r, 2 * node + 1);
A[node] = (A[2 * node] >= A[2 * node + 1] ? A[2 * node] : A[2 * node +1]);
}
}
void getMax(int a, int b, int l, int r, int node)
{
if(a <= l && r <= b)
{
if(A[node] > max)
max = A[node];
}
else
{
int middle = (r - l) / 2 + l, max1 = 0, max2 = 0;
if(a <= middle) getMax(a, b, l , middle, 2 * node);
if(middle + 1 <= b) getMax(a, b, middle + 1, r, 2 * node + 1);
}
}
int main()
{
FILE *in = fopen("arbint.in", "r");
FILE *out = fopen("arbint.out", "w");
int n, m, op, a, b;
fscanf(in, "%d %d", &n, &m);
for(a = 1; a <= n; a++)
{
fscanf(in, "%d", &b);
position = a;
value = b;
insert(1, n, 1);
}
for(; m; m--)
{
fscanf(in, "%d %d %d", &op, &a, &b);
if(op)
{
position = a;
value = b;
insert(1, n, 1);
}
else
{
max = 0;
getMax(a, b, 1, n, 1);
fprintf(out, "%d\n", max);
}
}
fclose(out);
return 0;
}