#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
FILE*f=fopen("arbint.in","rt");
ofstream out("arbint.out");
int n, m, poz, val, start, finish, vmax;
int arbore[400002];
void update(int, int, int);
void query(int, int, int);
int verifyMax(int a, int b){
if(a>b)return a;
else return b;
}
int main()
{
int x, a, b;
fscanf(f, "%d%d", &n, &m);
for(int i=1;i<=n;i++){
fscanf(f, "%d", &x);
poz = i; val = x;
update(1,1,n);
}
for(int i=1;i<=m;i++){
fscanf(f, "%d%d%d", &x, &a, &b);
if(x==0){
vmax = -1;
start = a; finish = b;
query(1,1,n);
out<<vmax<< '\n';
}
else{
poz=a;val=b;
update(1,1,n);
}
}
return 0;
}
void update(int nod, int st, int dr){
if(st == dr){
arbore[nod] = val;
return;
}
int mijl = (st+dr)/2;
if(poz <= mijl)
update(2*nod, st, mijl);
else update(2*nod+1, mijl+1, dr);
arbore[nod] = verifyMax(arbore[2*nod], arbore[2*nod+1]);
}
void query(int nod, int st, int dr){
if(start<=st && dr<=finish){
if(vmax<arbore[nod])
vmax = arbore[nod];
return;
}
int mijl = (st+dr)/2;
if(start<=mijl)
query(2*nod, st, mijl);
if(mijl<finish)
query(2*nod+1, mijl+1, dr);
}