#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, v[100001];
int getMid(int s, int e){
return (s + e) / 2;
}
/*int updateValueUtil(int *st, int ss, int se, int i, int new_val, int si){
if(i < ss || i > se)
return 0;
if(ss != se){
int mid = getMid(se, ss);
st[si] = max(updateValueUtil(st, ss, mid, i, new_val, 2 * si + 1), updateValueUtil(st, mid + 1, se, i, new_val, 2 * si + 2));
}
return st[si];
}*/
/*void updateValue(int v[], int *st, int n, int i, int new_val){
v[i] = new_val;
updateValueUtil(st, 0, n - 1, i, new_val, 0);
}*/
int getMaxUtil(int *st, int ss, int se, int qs, int qe, int si){
if(qs <= ss && qe >= se)
return st[si];
if(se < qs || ss > qe)
return 0;
int mid = getMid(ss, se);
return max(getMaxUtil(st, ss, mid, qs, qe, 2 * si + 1), getMaxUtil(st, mid + 1, se, qs, qe, 2 * si + 2));
}
int getMax(int *st, int n, int qs, int qe){
return getMaxUtil(st, 0, n - 1, qs, qe, 0);
}
int constructSTUtil(int v[], int ss, int se, int *st, int si){
if(ss == se){
st[si] = v[ss];
return v[ss];
}
int mid = getMid(ss, se);
st[si] = max(constructSTUtil(v, ss, mid, st, si * 2 + 1), constructSTUtil(v, mid + 1, se, st, si * 2 + 2));
return st[si];
}
void updateValue(int v[], int *st, int n, int i, int new_val){
v[i] = new_val;
constructSTUtil(v, 0, n - 1, st, 0);
}
int *constructST(int v[], int n){
int x = (int) (ceil(log2(n)));
int max_size = 2 * (int) pow(2, x) - 1;
int *st = new int[max_size];
constructSTUtil(v, 0, n - 1, st, 0);
return st;
}
int main(){
int n, m, v[100001], c, a, b;
fin >> n >> m;
for(int i = 0; i < n; i++)
fin >> v[i];
int *st = constructST(v, n);
for(int i = 1; i <= m; i++){
fin >> c >> a >> b;
if(c == 0)
fout << getMax(st, n, a - 1, b - 1) << '\n';
else
updateValue(v, st, n, a - 1, b);
}
}