#include <cstdio>
#include <algorithm>
using namespace std;
int n, m, x, y, Max, j, val, start, fin, Arb[400104], tip;
void update (int nod, int st, int dr)
{
if(st==dr){
Arb[nod]=val;
return;
}
int mij=(st+dr)/2;
if (j<=mij) update(2*nod, st, mij);
else update(2*nod+1, mij+1, dr);
Arb[nod]=max(Arb[2*nod], Arb[2*nod+1]);
}
void query (int nod, int st, int dr)
{
if (start<=st && dr<=fin)
{
Max=max(Max, Arb[nod]);
return;
}
int mij=(st+dr)/2;
if (start<=mij) query(2*nod, st, mij);
if (mij<fin) query(2*nod+1, mij+1, dr);
}
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", &x);
j=i; val=x;
update(1, 1, n);
}
for (int i=1; i<=m; i++){
scanf("%d%d%d", &tip, &x, &y);
if (tip==0){
Max=-1;
start=x, fin=y;
query(1, 1, n);
printf("%d\n", Max);
}
else{
j=x; val=y;
update(1, 1, n);
}
}
return 0;
}