#include <stdio.h>
#define MAXN 100005
int a[MAXN];
int seg[4 * MAXN];
int max(int a, int b)
{
return (a > b) ? a : b;
}
void build(int node, int l, int r)
{
if (l == r)
{
seg[node] = a[l];
return;
}
int mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
seg[node] = max(seg[2 * node], seg[2 * node + 1]);
}
void update(int node, int l, int r, int pos, int val)
{
if (l == r)
{
seg[node] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
update(2 * node, l, mid, pos, val);
else
update(2 * node + 1, mid + 1, r, pos, val);
seg[node] = max(seg[2 * node], seg[2 * node + 1]);
}
int query(int node, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
return seg[node];
if (r < ql || l > qr)
return 0;
int mid = (l + r) / 2;
return max(
query(2 * node, l, mid, ql, qr),
query(2 * node + 1, mid + 1, r, ql, qr));
}
int main()
{
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
int N, M;
fscanf(fin, "%d %d", &N, &M);
for (int i = 1; i <= N; i++)
fscanf(fin, "%d", &a[i]);
build(1, 1, N);
while (M--)
{
int type, x, y;
fscanf(fin, "%d %d %d", &type, &x, &y);
if (type == 0)
{
fprintf(fout, "%d\n", query(1, 1, N, x, y));
}
else
{
update(1, 1, N, x, y);
}
}
fclose(fin);
fclose(fout);
return 0;
}