#include <bits/stdc++.h>
using namespace std;
int n, m, a[1 << 19], aint[1 << 19];
void build(int l = 1, int r = n, int id = 1) {
if(l == r) {
aint[id] = a[l];
return;
}
int mij = (l + r) / 2;
build(l, mij, id * 2);
build(mij + 1, r, id * 2 + 1);
aint[id] = max(aint[id * 2 + 1], aint[id * 2]);
}
void update(int pos, int val, int l = 1, int r = n, int id = 1)
{
if(pos > r || pos < l || l > r)
return;
if(l == r)
{
aint[id] = val;
return;
}
int mij = (l + r) / 2;
update(pos, val, l, mij, id * 2);
update(pos, val, mij + 1, r, id * 2 + 1);
aint[id] = max(aint[id * 2], aint[id * 2 + 1]);
}
int query (int x, int y, int l = 1, int r = n, int id = 1)
{
if(l > r || r < x || y < l)
return 0;
if(l >= x && r <= y)
return aint[id];
int mij = (l + r) / 2;
return max(query(x, y, l, mij, id * 2), query(x, y, mij + 1, r, id * 2 + 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", &a[i]);
build();
while (m--)
{
int op, x, y;
scanf("%d %d %d", &op, &x, &y);
if(op == 1)
update(x, y), a[x] = y;
else printf("%d\n", query(x, y));
}
return 0;
}