/*
Keep It Simple!
*/
#include <fstream>
using namespace std;
const int MAX_N = 100005;
int arbint[4*MAX_N+1];
int N, M, mx;
ifstream f("arbint.in");
void Update(int node, int left, int right, int val, int idx) {
if (left == right) {
arbint[node] = val;
return;
}
int mij = (left + right)/2;
if (idx <= mij)
Update(2*node, left, mij, val, idx);
else
Update(2*node + 1, mij + 1, right, val, idx);
arbint[node] = max(arbint[2*node], arbint[2*node+1]);
}
void Query(int node, int left, int right, int a, int b) {
if (a <= left && right <= b) {
if (mx < arbint[node]) mx = arbint[node];
return;
}
int mij = (left + right) / 2;
if (a <= mij) Query(2*node, left, mij, a, b);
if (mij < b) Query(2*node+1, mij + 1, right, a, b);
}
void MakeArbInt() {
f >> N >> M;
int x;
for (int i = 1; i <= N; ++i) {
f >> x;
Update(1, 1, N, x, i);
}
}
void Solve() {
MakeArbInt();
int c, x, y;
ofstream g("arbint.out");
for (int i = 1; i <= M; ++i) {
f >> c >> x >> y;
if (c)
Update(1,1,N,y,x);
else {
mx = 0;
Query(1,1,N,x,y);
g << mx << '\n';
}
}
}
int main()
{
Solve();
return 0;
}