#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,ma;
int aint[4*100001];
void build(int nod, int st, int dr) {
if(st == dr) {
fin >>aint[nod];
return;
}
int mij = (st + dr)>> 1;
build(nod*2, st,mij);
build(nod*2+1,mij+1,dr);
aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}
void query(int nod, int st, int dr, int l, int r) {
if(l <= st && r >= dr) {
ma = max(ma, aint[nod]);
return;
}
int mij = (st + dr) >>1;
if(l <= mij)
query(nod*2, st, mij, l, r);
if(r > mij)
query(nod*2+1, mij+1,dr, l,r);
}
void update(int nod, int st, int dr, int poz, int val) {
if(st == dr) {
aint[nod] = val;
return;
}
int mij = (st + dr) >> 1;
if(poz <= mij)
update(nod*2,st,mij,poz,val);
if(poz > mij)
update(nod*2+1,mij+1,dr,poz,val);
aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}
int main() {
fin >> n >> m;
build(1,1,n);
for ( int i = 1,t,x,y; i <= m; ++i){
fin >> t >> x >> y;
if(t == 0)
{
ma = 0;
query(1,1,n,x,y);
fout << ma << "\n";
}
else update(1,1,n,x,y);
}
}