#include <iostream>
#include <fstream>
#define nmax 100001
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int n, m;
int x, a, b, maxim;
bool t;
int ARB[4*nmax];
void update(int nod, int st, int dr, int pos, int val)
{
if (st == dr)
{
ARB[nod] = val;
return;
}
int mid = (st + dr) >> 1;
if (pos <= mid) update(2*nod, st, mid, pos, val);
else update(2*nod+1, mid+1, dr, pos, val);
ARB[nod] = max(ARB[2*nod], ARB[2*nod+1]);
}
void query(int nod, int st, int dr, int start, int finish)
{
if (start <= st && dr <= finish)
{
maxim = max(maxim, ARB[nod]);
return;
}
int mid = (st + dr) >> 1;
if (start <= mid) query(2*nod, st, mid, start, finish);
if (finish > mid) query(2*nod+1, mid+1, dr, start, finish);
}
int main()
{
fi >> n >> m;
for (int i = 1; i <= n; i++)
fi >> x,
update(1, 1, n, i, x);
for (int i = 1; i <= m; i++)
{
fi >> t;
fi >> a >> b;
if (t)
{
// valoarea elementului de pe pozitia a va deveni b
update(1, 1, n, a, b);
}
else
{
// max([a, b])
maxim = -1;
query(1, 1, n, a, b);
fo << maxim << "\n";
}
}
fi.close();
fo.close();
return 0;
}