#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMAX=100010;
int n,m,ai[NMAX*4],v[NMAX],x,a,b;
void build_tree(int rad,int st,int dr) {
if(st==dr) {
ai[rad]=v[st];
} else {
int mij=(dr+st)/2;
build_tree(rad*2,st,mij);
build_tree(rad*2+1,mij+1,dr);
ai[rad]=max(ai[rad*2],ai[rad*2+1]);
}
}
void update(int rad,int st,int dr,int poz,int val) {
if(st==dr) {
ai[rad]=val;
} else {
int mij=(dr+st)/2;
if(poz<=mij) {
update(rad*2,st,mij,poz,val);
} else {
update(rad*2+1,mij+1,dr,poz,val);
}
ai[rad]=max(ai[rad*2],ai[rad*2+1]);
}
}
int query(int rad,int st,int dr,int a,int b) {
if(a<=st&&dr<=b) {
return ai[rad];
} else {
int mij=(dr+st)/2,r1=0,r2=0;
if(a<=mij) {
r1=query(rad*2,st,mij,a,b);
}
if(mij<b) {
r2=query(rad*2+1,mij+1,dr,a,b);
}
return max(r1,r2);
}
}
int main() {
f>>n>>m;
for(int i=1; i<=n; i++) {
f>>v[i];
}
build_tree(1,1,n);
while(m--) {
f>>x>>a>>b;
if(x==0) {
g<<query(1,1,n,a,b)<<"\n";
} else {
update(1,1,n,a,b);
}
}
f.close();
g.close();
return 0;
}