#include <iostream>
#include <fstream>
#define NMAX 400005
using namespace std;
int n;
int tree[NMAX];
inline void update(int pos, int left, int right, int x, int val){
if (left == right)
tree[pos] = val;
else {
int middle = (left + right) / 2;
if (x <= middle)
update(2 * pos, left, middle, x, val);
else
update(2 * pos + 1, middle + 1, right, x, val);
tree[pos] = tree[2 * pos] >= tree[2 * pos + 1] ? tree[2 * pos] : tree[2 * pos + 1];
}
return;
}
inline int query(int pos, int left, int right, int left_pos, int right_pos){
if (left_pos <= left && right <= right_pos)
return tree[pos];
else {
int l = 0, r = 0;
int middle = (left + right) / 2;
if (left_pos <= middle)
l = query(2 * pos, left, middle, left_pos, right_pos);
if (right_pos > middle)
r = query(2 * pos + 1, middle + 1, right, left_pos, right_pos);
return l <= r ? r : l;
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int m, type, x, y;
f >> n >> m;
for (int i = 1; i <= n; i++){
f >> x;
update(1, 1, n, i, x);
}
for ( ; m; m--){
f >> type >> x >> y;
if (type == 0)
g << query(1, 1, n, x, y) << '\n';
else
update(1, 1, n, x, y);
}
f.close();
g.close();
return 0;
}