#include <fstream>
#include <iostream>
#define MX -1;
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int nx=100000;
int a[nx], n, m;
int t[2*nx];
void build(int v, int vl, int vr, int a[]){
if(vl==vr){
t[v]=a[vl];
return ;
}
int vm=vl+(vr-vl)/2;
build(2*v+1, vl, vm, a);
build(2*v+2, vm+1, vr, a);
t[v]=max(t[2*v+1],t[2*v+2]);
}
int rmq(int v, int vl, int vr, int l, int r){
if(r<vl||l>vr)
return MX;
if(vl>=l && vr<=r)
return t[v];
int vm=vl+(vr-vl)/2;
int ql=rmq(2*v+1, vl, vm, l, r);
int qr=rmq(2*v+2, vm+1, vr, l, r);
return max(ql,qr);
}
void add(int v, int vl, int vr, int pos, int val){
if(pos<vl||pos>vr)
return;
if(vl>=pos && vr<=pos)
t[v]=val;
else{
int vm=vl+(vr-vl)/2;
add(2*v+1, vl, vm, pos, val);
add(2*v+2, vm+1, vr, pos, val);
t[v]=max(t[2*v+1],t[2*v+2]);
}
}
int main()
{
f>>n>>m;
for(int i=0;i<n;i++) f>>a[i];
build(0,0,n-1,a);
while (m){
int w, u, v;
f>>w>>u>>v;
if (!w) g<<rmq(0,0,n-1,u-1,v-1)<<endl;
else add(0,0,n-1,u-1,v); m--;
}
return 0;
}