#include <bits/stdc++.h>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
const int NMAX = 1e5;
int aint[NMAX*4 + 4];
int n, q;
void update(int nod, int st, int dr, int poz, int val){
if(st == dr){
aint[nod] = val;
return;
}
int mij = (st + dr)/2;
if(poz <= mij)
update(2*nod, st, mij, poz, val);
else update(2*nod+1, mij+1, dr, poz, val);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
int query(int nod, int st, int dr, int ist, int idr){
if(st >= ist and dr <= idr)
return aint[nod];
int mij = (st+dr)/2;
int aux = -1;
if(ist <= mij)
aux = max(aux, query(2*nod, st, mij, ist, idr));
if(idr > mij)
aux = max(aux, query(2*nod+1, mij+1, dr, ist, idr));
return aux;
}
int main()
{
f >> n >> q;
for(int i=1; i<=n; i++){
int k;
f >> k;
update(1, 1, n, i, k);
}
for(int i=1; i<=q; i++){
int t, a, b;
f >> t >> a >> b;
if(t == 0)
g << query(1, 1, n, a, b) << "\n";
else{
update(1, 1, n, a, b);
}
}
return 0;
}