#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int arb[400000];
int n, a[100000], m;
int build(int poz, int s, int f){
if(s == f){
arb[poz] = a[s];
return arb[poz];
}
arb[poz] = max(build(poz * 2 + 1, s, (s+f)/2), build(poz * 2 + 2, (s+f)/2 + 1, f));
return arb[poz];
}
int detMax(int poz, int s, int f, int a, int b){
if(a == s && b == f)
return arb[poz];
int mij = (s+f) / 2;
if(a<=mij && b<=mij)
return detMax(poz * 2 + 1, s, mij, a, b);
if(a>mij && b>mij)
return detMax(poz * 2 + 2, mij + 1, f, a, b);
return max(detMax(poz * 2 + 1, s, mij, a, mij), detMax(poz * 2 + 2, mij + 1, f, mij + 1, b));
}
int changeElement(int poz, int s, int f, int a, int b){
if(s == f && s == a)
return arb[poz] = b;
if(a <= (s + f) / 2){
arb[poz] = max(changeElement(poz * 2 + 1, s, (s + f) / 2, a, b), arb[poz * 2 + 2]);
return arb[poz];
}
arb[poz] = max(arb[poz * 2 + 1], changeElement(poz * 2 + 2, (s + f) / 2 + 1, f, a, b));
return arb[poz];
}
int main()
{
ifstream f("arbint.in");
f>>n>>m;
for(int i=0; i<n; i++)
f>>a[i];
build(0, 0, n-1);
ofstream g("arbint.out");
for(int i=0; i<m; i++){
int op;
f>>op;
int a, b;
f>>a>>b;
if(op == 0){
g<<detMax(0, 0, n-1, a - 1, b - 1)<<endl;
continue;
}
changeElement(0, 0, n-1, a - 1, b - 1);
}
return 0;
}