#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100001;
int n, m;
int a[maxn];
int tree[2 * maxn];
void update(int n, int l, int r, int poz, int val)
{
//fprintf(stderr,"try %d %d %d %d %d\n", n, l, r, poz, val);
if (l == r)
{
a[l] = val;
tree[n] = a[l];
//fprintf(stderr,"supdate %d %d %d %d %d\n", n, l, r, poz, val);
return ;
}
int mid = (l + r) >> 1;
if (mid >= poz) update(2 * n, l, mid, poz, val);
if (mid < poz) update(2 * n + 1, mid + 1, r, poz, val);
tree[n] = max(tree[2 * n], tree[2 * n + 1]);
//fprintf(stderr,"updated %d %d %d %d %d\n", n, l, r, poz, val);
}
int res = 0;
void query(int n, int l, int r, int li, int ri)
{
//fprintf(stderr,"try %d %d %d %d %d\n", n, l, r, li, ri);
if (li <= l && r <= ri)
{
res = max(res, tree[n]);
//fprintf(stderr,"get %d %d %d %d %d -> %d\n", n, l, r, li, ri, res);
return ;
}
int mid = (l + r) >> 1;
if (li <= mid) query(2 * n, l, mid, li, ri);
if (ri > mid) query(2 * n + 1, mid + 1, r, li, ri);
}
void debug()
{
for (int i = 1; i <= 2 * n; ++i)
fprintf(stderr,"%d ", tree[i]);
fprintf(stderr,"\n");
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d\n", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
update(1, 1, n, i, a[i]);
//debug();
}
for (int i = 1; i <= m; ++i)
{
int tip, a, b; scanf("%d%d%d", &tip, &a, &b);
if (tip == 0)
{
res = 0;
query(1, 1, n, a, b);
printf("%d\n", res);
}
else
update(1, 1, n, a, b);
}
return 0;
}