#include <fstream>
using namespace std;
const int N = 100005, DAint = 5*N, inf = 0x3f3f3f3f;
int aint[DAint], n, rez_aint;
ifstream in("arbint.in");
ofstream out("arbint.out");
inline int max(int a, int b)
{
return a > b ? a : b;
}
inline void nod_update(int& T, int st, int dr)
{
T = max (st, dr);
}
void update(int poz, int st, int dr, int x, int val)
{
if (st == dr)
{
aint[poz] = val;
return ;
}
int m = (st + dr) >> 1, S = poz << 1, D = S + 1;
if (x <= m)
update(S, st, m, x, val);
else
update(D, m + 1, dr, x, val);
nod_update(aint[poz], aint[S], aint[D]);
}
void query(int poz, int st, int dr, int x, int y)
{
if (x <= st && dr <= y)
{
nod_update(rez_aint, rez_aint, aint[poz]);
return ;
}
int m = (st + dr) >> 1, S = poz << 1, D = S + 1;
if (x <= m)
query (S, st, m, x, y);
if (m < y)
query (D, m + 1, dr, x, y);
}
int query (int x, int y)
{
rez_aint = -inf;
query (1, 1, n, x, y);
return rez_aint;
}
int main()
{
int m, x, y, val;
in >> n >> m;
for (int i = 1 ; i <= n ; i++)
{
in >> x;
update(1, 1, n, i, x);
}
while (m--)
{
in >> x;
if (!x)
{
in >> x >> y;
out <<query (x, y)<<"\n";
continue;
}
in >> x >> val;
update(1, 1, n, x, val);
}
return 0;
}