#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int lista[100001];
int arb[400004];
void build (int nod, int s, int d)
{
if (s == d){
arb[nod] = lista[s];
//cout << s << '-'<< d <<' '<< arb[nod] << endl;
}
else{
int mij = (s + d) / 2;
build(2*nod, s, mij);
build(2*nod+1, mij+1, d);
arb[nod] = max(arb[2*nod],arb[2*nod+1]);
//cout << s << '-'<< d <<' '<< arb[nod] << endl;
}
}
void update (int nod, int s, int d, int indx, int val)
{
if (s == d){
lista[indx] = val;
arb[nod] = val;
}
else{
int mij = (s + d) / 2;
if (s <= indx && indx <= mij)
update(2*nod, s, mij, indx, val);
else
update(2*nod+1, mij+1, d, indx, val);
arb[nod] = max(arb[2*nod],arb[2*nod + 1]);
}
}
int query(int nod, int s, int d, int l, int r)
{
if (r < s || d < l )
return 0;
if (l <= s && d <= r)
return arb[nod];
int mij = (s + d) / 2;
int p1 = query(2*nod, s, mij, l, r);
int p2 = query(2*nod+1, mij+1, d, l, r);
return max(p1, p2);
}
int main()
{
int nr, op, i, cod, a, b;
fin >> nr >> op;
for (i = 1; i <= nr; i++)
fin >> lista[i];
build(1, 1, nr);
for (i = 1; i <= op; i++){
fin >> cod >> a >> b;
if (cod == 0)
fout << query(1, 1, nr, a, b) <<"\n";
else
update(1, 1, nr, a, b);
}
return 0;
}