#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int AMAX = 4e5+1, NMAX= 1e5+1;
long long aint[AMAX], v[NMAX];
int n, m;
void constructie(int pos, int l, int r){
if(l==r)
aint[pos]=v[l];
else{
int m=(l+r)/2;
constructie(2*pos, l, m);
constructie(2*pos+1, m+1, r);
aint[pos]=max(aint[2*pos],aint[2*pos+1]);
}
}
long long query(int pos, int al, int ar, int l, int r){
//cout<<pos<<' '<<al<<' '<<ar<<endl;
if(l<=al&&ar<=r)
return aint[pos];
int m=(al+ar)/2;
long long s1=0, s2=0;
//cout<<m<<endl;
if(m>=l)
s1=query(2*pos, al, m, l, r);
if(m<r)
s2=query(2*pos+1, m+1, ar, l, r);
return max(s1, s2);
}
void update(int pos, int l, int r, int k, int val){
if(l==r)
aint[pos]=val;
else{
int m=(l+r)/2;
if(k<=m)
update(2*pos, l, m, k, val);
else
update(2*pos+1, m+1, r, k, val);
aint[pos]=max(aint[2*pos],aint[2*pos+1]);
}
}
int main(){
fin>>n>>m;
//cout<<n<<' '<<m<<endl;
for(int i=1;i<=n;i++)
fin>>v[i];
constructie(1, 1, n);
/*for(int i=1;i<=n;i++)
cout<<v[i]<<' ';
cout<<endl;
for(int i=1;i<=4*n;i++)
cout<<i<<' '<<aint[i]<<endl;*/
int o, a, b;
while(m--){
fin>>o>>a>>b;
//cout<<o<<' '<<a<<' '<<b<<endl;
if(o==0)
fout<<query(1, 1, n, a, b)<<endl;
else
update(1, 1, n, a,b);
}
return 0;
}