#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
void Update (int poz, int val, int nod, int st, int dr, vector<int>&MaxArb)
{
if (st == dr)
{
MaxArb[nod] = val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij)
Update(poz, val, nod * 2, st, mij, MaxArb);
else
Update(poz, val, nod * 2 + 1, mij + 1, dr, MaxArb);
MaxArb[nod] = max(MaxArb[nod * 2], MaxArb[nod * 2 + 1]);
}
void Query (int&maxim, int Start, int Final, int nod, int st, int dr, vector<int>&MaxArb)
{
if (st >= Start && dr <= Final)
{
maxim = max(maxim, MaxArb[nod]);
return;
}
int mij = (st + dr) / 2;
if (mij >= Start) Query(maxim, Start, Final, nod * 2, st, mij, MaxArb);
if (mij < Final) Query(maxim, Start, Final, nod * 2 + 1, mij + 1, dr, MaxArb);
}
int main()
{
int n, T;
in >> n >> T;
vector<int> MaxArb(n * 4);
for (int i = 1; i <= n; i++)
{
int x;
in >> x;
Update(i, x, 1, 1, n, MaxArb);
}
while (T--)
{
int tip, a, b;
in >> tip >> a >> b;
if (tip == 1)
{
Update(a, b, 1, 1, n, MaxArb);
continue;
}
int maxim = 0;
Query(maxim, a, b, 1, 1, n, MaxArb);
out << maxim << '\n';
}
return 0;
}