#include <fstream>
#define MAX 100001
int d[2*MAX];
using namespace std;
int get(int node, int l, int r, int a, int b){
int m = 0, result;
if(l>=a && r<=b)
return d[node];
else{
m = (l+r)/2;
result = -1;
if(m>=a)
result = get(2*node, l, m, a, b);
if(m+1<=b) {
m = get(2*node+1, m+1, r, a, b);
result = result>m? result: m;
}
return result;
}
}
void put(int node, int l, int r, int a, int b){
int m = 0;
if(l==a && r==a)
d[node] = b;
else {
m = (l+r)/2;
if(m>=a)
put(2*node, l, m, a, b);
if(m+1<=a)
put(2*node+1, m+1, r, a ,b);
d[node] = d[2*node]>d[2*node+1]? d[2*node]: d[2*node+1];
}
}
int main(){
int n, m, op, a, b, i;
ifstream in("arbint.in");
ofstream out("arbint.out");
in>>n>>m;
for(i=1; i<=n; i++){
in>>a;
put(1, 1, n, i, a);
}
for(i=0; i<m; i++){
in>>op>>a>>b;
if(op==0)
out<<get(1, 1, n, a, b)<<endl;
else
put(1, 1, n, a, b);
}
in.close();
out.close();
return 0;
}