#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int Nmax = 200005;
int aint[Nmax],v[Nmax];
void build(int node, int st, int dr){
if(st == dr){
aint[node] = v[st];
return;
}
int mid = (st+dr)/2;
build(node+node, st, mid);
build(node+node+1, mid+1, dr);
aint[node] = max(aint[node+node], aint[node+node+1]);
}
void update(int node, int st, int dr, int x, int y){
if(st == dr){
aint[node] = y;
return;
}
int mid = (st+dr)/2;
if(x<=mid)
update(node+node, st, mid, x, y);
else
update(node+node+1, mid+1, dr, x, y);
aint[node] = max(aint[node+node], aint[node+node+1]);
}
int query(int node, int st, int dr, int x, int y){
if(st == x && dr == y)
return aint[node];
int mid = (st+dr)/2;
if(y<=mid)
return query(node+node, st, mid, x, y);
if(x>mid)
return query(node+node+1, mid+1, dr, x, y);
return max(query(node+node, st, mid, x, mid), query(node+node+1, mid+1, dr, mid+1, y));
}
int main()
{
int n,m,i;
fin >> n >> m;
for(i=1;i<=n;i++)
fin >> v[n];
build(1,1,n);
for(i=1;i<=m;i++){
int t,x,y;
fin >> t >> x >> y;
if(t == 0)
fout << query(1,1,n,x,y) << '\n';
else
update(1,1,n,x,y);
}
return 0;
}