#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int N,M;
int v[100000], rmq[322222];
void build(int pos, int l, int r) {
if (l == r) {
rmq[pos] = v[l];
}
else{
int mid = (l + r) / 2;
build(2 * pos + 1, l, mid);
build(2 * pos + 2, mid + 1, r);
rmq[pos] = max(rmq[2 * pos + 1], rmq[2 * pos + 2]);
}
}
void update(int pos, int a, int b, int l, int r) {
if (l == r) {
rmq[pos] = b;
return;
}
int mid = (l + r) / 2;
if(a <= mid)
update(2 * pos + 1, a, b, l, mid);
else
update(2 * pos + 2, a, b, mid+1, r);
rmq[pos] = max(rmq[2 * pos + 1], rmq[2 * pos + 2]);
}
int RMQ(int pos, int l, int r, int a, int b)
{
if (l > a || r < b)
return 0;
if (a <= l && b >= r)
return rmq[pos];
int mid = l + (r - l) / 2;
if (a > mid)
return RMQ(2 * pos + 2, mid + 1, r, a, b);
else if (b <= mid)
return RMQ(2 * pos + 1, l, mid, a, b);
int lQ= RMQ(2 * pos + 1, l, mid, a, mid);
int rQ = RMQ(2 * pos + 2, mid + 1, r, mid + 1, b);
return max(lQ, rQ);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> N >> M;
int i;
for(i = 0; i < N; i++)
f >> v[i];
build(0,0,N-1);
int a, b, type;
for (i = 0; i < M; i++){
f >> type >> a >> b;
if(type == 1)
update(0,a-1,b,0,N - 1);
if(type == 0)
g << RMQ(0, 0, N - 1, a-1, b-1) << "\n";
}
f.close();
g.close();
return 0;
}