#include<iostream>
#include<fstream>
using namespace std;
#define max 100000
ifstream f("arbint.in");
ofstream g("arbint.out");
//0 max
//1 update
int N, M, tree[4*max+5];
void update_pos(int node, int st, int dr, int pos, int x) {
if (st == dr) {
tree[node] = x;
return;
}
int mij = (st + dr) / 2;
if (pos <= mij)
update_pos(node * 2, st, mij, pos, x);
else
update_pos(node * 2 + 1, mij + 1, dr, pos, x);
if (tree[node * 2] > tree[node * 2 + 1])
tree[node] = tree[node * 2];
else
tree[node] = tree[node * 2 + 1];
}
int query(int node, int st, int dr,int a, int b) {
if (a <= st&&dr <= b)
return tree[node];
int mij = (st + dr) / 2,rs=-1,rd=-1;
if (a <= mij)
{
rs=query(node * 2, st, mij, a, b);
}
if (mij<b)
{
rd = query(node * 2 + 1, mij + 1, dr, a, b);
}
if (rs > rd)
return rs;
return rd;
}
void citire() {
int op, val, a, b;
f >> N >> M;
for (int i = 1; i <= N; i++) {
f >> val;
update_pos(1,1,N, i, val);
}
for (int i = 0; i < M; i++) {
f >> op;
if (op) {
f >> a>>b;
update_pos(1,1,N,a,b);
}
else
{
f >> a >> b;
g << query(1, 1, N, a, b)<<endl;
}
}
}
int main() {
citire();
//system("pause");
return 0;
}