#include <bits/stdc++.h>
#define Nmax 100000
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int AINT[5 + Nmax * 4];
int N;
int Q;
static inline void update (int node, int left, int right, int value, int index);
static inline int query (int node, int left, int right, int start, int finish);
int main()
{
fin >> N >> Q;
for (int i = 1; i <= N; ++i)
{
int integer;
fin >> integer;
update (1, 1, N, integer, i);
}
while (Q--)
{
int start, finish, operation, value, index;
fin >> operation;
if (operation == 1)
{
fin >> index >> value;
update (1, 1, N, value, index);
}
else
{
fin >> start >> finish;
fout << query (1, 1, N, start, finish) << "\n";
}
}
return 0;
}
static inline void update (int node, int left, int right, int value, int index)
{
if (left == right)
{
AINT[node] = value;
return;
}
int mid = (left + right) / 2;
if (index <= mid)
update (2 * node, left, mid, value, index);
else
update (2 * node + 1, mid + 1, right, value, index);
AINT[node] = max (AINT[node * 2], AINT[2 * node + 1]);
}
static inline int query (int node, int left, int right, int start, int finish)
{
if (start <= left && finish >= right)
return AINT[node];
int mid = (left + right) / 2, firstAnswer = 0, secondAnswer = 0;
if (start <= mid)
firstAnswer = query (2 * node, left, mid, start, finish);
if (finish > mid)
secondAnswer = query (2 * node + 1, mid + 1, right, start, finish);
return max (firstAnswer, secondAnswer);
}