#include<iostream>
#include<fstream>
#define NMAX 100007
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int ST[4*NMAX], A[NMAX];
int N, M;
void updateST(int node, int left, int right, int pos, int val){
if(left == right){
ST[node] = val;
return;
}
int mid = (left + right) / 2;
if(pos <= mid)
updateST(2*node, left, mid, pos, val);
else
updateST(2*node+1, mid+1, right, pos, val);
ST[node] = max(ST[2*node], ST[2*node+1]);
}
int queryST(int node, int left, int right, int x, int y)
{
if(x <= left && right <= y)
return ST[node];
if(y <= left || right <= x)
return 0;
int mid=(left+right)/2;
int ans_l = queryST(2*node, left, mid, x, y);
int ans_r = queryST(2*node+1, mid+1, right, x, y);
return max(ans_l, ans_r);
}
int main(){
fin>>N>>M;
for(int i=1; i<=N; ++i){
fin>>A[i];
updateST(1, 1, N, i, A[i]);
}
int a, b, c;
for(int i=0; i<M; ++i){
fin>>c>>a>>b;
if(c==0){
fout<<queryST(1, 1, N, a, b)<<'\n';
}
else{
updateST(1, 1, N, a, b);
}
}
return 0;
}