#include <iostream>
#include <vector>
using namespace std;
int n,m;
vector<int> V;
vector<int> ArbInt;
void buildTree(int nod, int st, int dr){
if(st == dr){
ArbInt[nod] = V[st];
return;
}
int mij = (st + dr)/2;
buildTree(2*nod,st,mij);
buildTree(2*nod+1,mij+1,dr);
ArbInt[nod] = max(ArbInt[2*nod],ArbInt[2*nod+1]);
}
void afiseaza(int nod, int st, int dr, int nivel = 0) {
cout << st << "," << dr << " = " << ArbInt[nod] << "\n";
if (st == dr) return;
int mij = (st + dr) / 2;
afiseaza(2*nod, st, mij, nivel + 1);
afiseaza(2*nod+1, mij+1, dr, nivel + 1);
}
void update(int nod, int st, int dr, int poz, int val){
if(st == dr){
ArbInt[nod] = val;
V[poz] = 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);
ArbInt[nod] = max(ArbInt[2*nod],ArbInt[2*nod+1]);
}
int query(int nod,int st,int dr,int a,int b){
if(a <= st && dr <= b)
return ArbInt[nod];
int mij = (st + dr)/2;
int rez = 0;
if(a <= mij)
rez = max(rez, query(2*nod,st,mij,a,b));
if(b > mij)
rez = max(rez, query(2*nod+1,mij+1,dr,a,b));
return rez;
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
cin >> n >> m;
V.resize(n+1);
ArbInt.resize(4*n);
for(int i = 1;i <= n; ++i)
cin >> V[i];
buildTree(1,1,n);
/*update(1,1,n,4,7);
for(int i = 1;i <= n; ++i)
cout << V[i] << ' ';
cout << '\n';
afiseaza(1,1,n);*/
for(int i = 0;i < m; ++i){
int op,a,b;
cin >> op >> a >> b;
if(op == 0){
cout << query(1,1,n,a,b) << "\n";
}
else{
update(1,1,n,a,b);
}
}
return 0;
}