#include <bits/stdc++.h>
using namespace std;
int aint[400001];
int v[100001];
void update(int nod,int st,int dr,int poz,int val){
if(st == dr){
aint[nod] = val;
return;
}
int mid = (st + dr) / 2;
if(poz <= mid){
update(nod * 2,st,mid,poz,val);
}else{
update(nod * 2 + 1,mid + 1,dr,poz,val);
}
aint[nod] = max(aint[nod * 2],aint[nod * 2 + 1]);
}
int query(int nod,int st,int dr,int a,int b){
if(a <= st && dr <= b){
return aint[nod];
}
int mid = (st + dr) / 2;
int rez1 = 0;
int rez2 = 0;
if(a <= mid){
rez1 = query(nod * 2,st,mid,a,b);
}
if(b > mid){
rez2 = query(nod * 2 + 1,mid + 1,dr,a,b);
}
return max(rez1,rez2);
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int q,i,n;
cin >> n >> q;
for(i = 1;i <= n;i++){
cin >> v[i];
update(1,1,n,i,v[i]);
}
while(q--){
int tip,a,b;
cin >> tip >> a >> b;
if(tip == 0){
cout << query(1,1,n,a,b) << "\n";
}else{
update(1,1,n,a,b);
}
}
return 0;
}