#include <stdio.h>
int a[100000];
int max[1000000];
void initialize(int node, int b, int e)
{
if (b == e) {
max[node] = b;
return;
}
initialize(2 * node, b, (b + e) / 2);
initialize(2 * node + 1, (b + e) / 2 + 1, e);
int p1 = max[2 * node];
int p2 = max[2 * node + 1];
max[node] = (a[p1] > a[p2]) ? p1 : p2;
}
int query(int node, int b, int e, int i, int j)
{
if (j < b || e < i)
return -1;
if (i <= b && e <= j)
return max[node];
int m1 = query(2 * node, b, (b + e) / 2, i, j);
int m2 = query(2 * node + 1, (b + e) / 2 + 1, e, i, j);
if (m1 == -1)
return m2;
if (m2 == -1)
return m1;
return (a[m1] > a[m2]) ? m1 : m2;
}
void update(int node, int b, int e, int x)
{
if (b == e)
return;
int m = (b + e) / 2;
if (x <= m)
update(2 * node, b, m, x);
else
update(2 * node + 1, m + 1, e, x);
int p1 = max[2 * node];
int p2 = max[2 * node + 1];
max[node] = (a[p1] > a[p2]) ? p1 : p2;
}
int main()
{
int n, m;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d ", &a[i]);
initialize(1, 0, n - 1);
for (int i = 0; i < m; i++) {
int op, x, y;
scanf("%d %d %d\n", &op, &x, &y);
switch (op) {
case 0:
printf("%d\n", a[query(1, 0, n - 1, x - 1, y - 1)]);
break;
case 1:
a[x - 1] = y;
update(1, 0, n - 1, x - 1);
break;
}
}
return 0;
}