#include <bits/stdc++.h>
using namespace std;
long long d=1, s=0;
long long pow2(long long n){
long long i =1;
while(i<n){
i*=2;
}
return i;
}
int query(int l, int r, vector <long long> &tree, int pos, int sl,int sr){
if(l==sl && r ==sr){
return tree[pos];
}
int mid = (sl+sr)/2;
if(r <= mid){
return query(l,r,tree,2*pos,sl,mid);
}
if(l > mid){
return query(l,r,tree,2*pos+1,mid+1,sr);
}
int r1 = query(l,mid,tree,2*pos,sl,mid);
int r2 = query(mid+1,r,tree,2*pos+1,mid+1,sr);
return max(r1,r2);
}
void set_(int i, long long val, vector <long long> &tree){
int pos = tree.size()/2+i;
tree[pos] = val;
pos =pos/2;
while(pos >0){
tree[pos] = max(tree[2*pos],tree[2*pos+1]);
pos =pos/2;
}
}
int main()
{
ifstream cin{"arbori.in"};
ofstream cout{"arbori.out"};
long long n, m;
cin >> n >> m;
long long len = pow2(n)*2;
vector <long long> tree(len,-1);
for(int i=0; i<n; i++){
long long val;
cin >> val;
set_(i,val,tree);
}
int k, a, b;
for (int i=0; i<m; i+=1){
cin >> k >> a >> b;
if (k==0){
int res = query(--a, --b, tree, 1, 0, (len-1)/2);
cout<<res<<endl;
} else if (k==1){
set_(--a, b, tree);
}
}
return 0;
}