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