//Bibiliografie:
//https://www.hackerearth.com/practice/data-structures/advanced-data-structures/segment-trees/tutorial/
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,z,comanda, tree[400004];
int arr[100001];
void build(int node, int start, int end){
if(start == end){
tree[node] = arr[start];
}else{
int mid = (start + end)/2;
build(2*node, start, mid);
build(2*node + 1,mid+1, end);
tree[node] = max(tree[2*node], tree[2*node + 1] );
}
}
void update(int node, int start, int end, int indx, int val){
if(start == end){
arr[indx] = val;
tree[node] = val;
}else{
int mid = (start + end)/2;
if(start <= indx && indx <= mid){//fiul stang
update(2*node,start, mid, indx, val);
}else{
update(2*node + 1,mid+1, end,indx, val);
}
tree[node] = max(tree[2*node], tree[2*node + 1]);
}
}
int maxQuery(int node, int start, int end, int l , int r){
if(r < start || l > end)
return 0;
if(l <= start && end <= r)
return tree[node];
int mid = (start + end) / 2;
int p1 = maxQuery(2*node, start, mid, l, r);
int p2 = maxQuery(2*node + 1, mid + 1, end, l, r);
return max(p1,p2);
}
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int main()
{
fin>>n>>m;
for(int i = 0; i< n; i++){
fin>>x;
arr[i] =x;
}
build(1,0,n-1);
for(int i = 0; i < m; i++){
fin>>comanda;
if(comanda == 0){
fin>>y>>z;
fout<<maxQuery(1,0,n-1,y-1,z-1)<<"\n";
}
else{
fin>>y>>z;
update(1,1,n,y,z);
}
}
fin.close();
fout.close();
return 0;
}