#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int *tree = new int[400005], *v = new int[100001];
void build(int nod, int l, int r)
{
if(l == r)
tree[nod] = v[l];
else
{
build(2*nod, l, (l+r)/2);
build(2*nod+1, (l+r)/2+1, r);
tree[nod] = max(tree[2*nod], tree[2*nod+1]);
}
}
void update(int nod, int l, int r, int a, int b)
{
if(l == r && l == a)
tree[nod] = b;
else
{
int m = (l+r)/2;
if(a <= m)
update(2*nod,l,m,a,b);
else
update(2*nod+1, m+1, r, a, b);
tree[nod] = max(tree[2*nod], tree[2*nod+1]);
}
}
int query(int nod, int l, int r, int x, int y)
{
if(x > y)
return 0;
if(l == x && r == y)
return tree[nod];
int m = (l+r)/2;
return max(query(2*nod, l, m, x, min(y, m)), query(2*nod+1, m+1, r, max(x,m+1), y));
}
int main()
{
int n, q, t, a, b;
fin >> n >> q;
for(int i = 1; i <= n; ++i)
fin >> v[i];
build(1, 1, n);
while(q--)
{
fin >> t >> a >> b;
if(t == 0)
fout << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, a, b);
}
return 0;
}