#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M, V[100001], A[400004];
void preprocess(int pos, int left, int right)
{
if (left == right)
{
A[pos] = V[left];
return;
}
int middle = (left + right) / 2;
preprocess(pos * 2, left, middle);
preprocess(pos * 2 + 1, middle + 1, right);
A[pos] = max(A[pos * 2], A[pos * 2 + 1]);
}
void update(int pos, int left, int right, int a)
{
if (a < left || right < a)
return;
if (left == right)
{
A[pos] = V[left];
return;
}
int middle = (left + right) / 2;
update(pos * 2, left, middle, a);
update(pos * 2 + 1, middle + 1, right, a);
A[pos] = max(A[pos * 2], A[pos * 2 + 1]);
}
int query(int pos, int left, int right, int a, int b)
{
if (b < left || right < a)
return 0;
if (a <= left && right <= b)
return A[pos];
int middle = (left + right) / 2;
return max(query(pos * 2, left, middle, a, b), query(pos * 2 + 1, middle + 1, right, a, b));
}
int main()
{
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
fin >> V[i];
preprocess(1, 1, N);
}
for (int i = 1; i <= M; i++)
{
int o, a, b;
fin >> o >> a >> b;
switch (o)
{
case 0:
fout << query(1, 1, N, a, b) << '\n';
break;
case 1:
V[a] = b;
update(1, 1, N, a);
break;
}
}
}