#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMax = 1e5, oo = 0x3f3f3f3f;
int n, m, x;
int aint[4 * NMax + 5];
void Update(int node, int left, int right, int pos, int value){
if (left == right){
aint[node] = value;
return;
}
int mid = (left + right) >> 1;
int leftson = 2 * node, rightson = leftson + 1;
if (pos <= mid)
Update(leftson, left, mid, pos, value);
else
Update(rightson, mid + 1, right, pos, value);
aint[node] = max(aint[leftson], aint[rightson]);
}
void Read(){
fin >> n >> m;
for (int i = 1; i <= n; i++){
fin >> x;
Update(1, 1, n, i, x);
}
}
int Query(int node, int left, int right, int leftquery, int rightquery){
if (left == right)
return aint[node];
int mid = (left + right) >> 1;
int leftson = 2 * node, rightson = leftson + 1;
int ans = -oo;
if (mid >= leftquery)
ans = max(ans, Query(leftson, left, mid, leftquery, rightquery));
if (mid + 1 <= rightquery)
ans = max(ans, Query(rightson, mid + 1, right, leftquery, rightquery));
return ans;
}
int main(){
Read();
while (m--){
int type, a, b;
fin >> type >> a >> b;
if (type == 0)
fout << Query(1, 1, n, a, b) << '\n';
if (type == 1)
Update(1, 1, n, a, b);
}
return 0;
}