#include <bits/stdc++.h>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
#define maxn 100005
int v[maxn];
int aint[4*maxn];
void build(int n, int left, int right){
int mid = (left + right)/2;
if(left == right){
aint[n] = v[left];
}else{
build(2*n, left, mid);
build(2*n+1, mid+1, right);
aint[n] = std::max(aint[2*n], aint[2*n+1]);
}
}
void update(int n, int left, int right, int p, int val){
int mid = (left + right)/2;
if(left == right)
{
aint[n] = val;
return;
}
if(p <= mid){
update(2*n, left, mid, p, val);
}else{
update(2*n+1, mid+1, right, p, val);
}
aint[n] = std::max(aint[2*n], aint[2*n+1]);
}
int query(int n, int left, int right, int a, int b){
int mid = (left+right)/2;
if(b < left || a > right)
return 0;
if(a <= left && right <= b)
return aint[n];
return std::max(query(2*n, left, mid, a, b),query(2*n+1, mid+1, right, a, b));
}
int main(){
int n, k;
fin >> n >> k;
for(int i = 1; i <= n; i++){
int x;
fin >> x;
v[i] = x;
}
build(1, 1, n);
int operationType, leftIntervalOrPos, rightIntervalOrVal;
for(int i = 1; i <= k; i++){
fin >> operationType >> leftIntervalOrPos >> rightIntervalOrVal;
if(operationType == 0)
fout << query(1, 1, n, leftIntervalOrPos, rightIntervalOrVal) << '\n';
else
update(1, 1, n, leftIntervalOrPos, rightIntervalOrVal);
}
}