#include <bits/stdc++.h>
#define nMax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[4 * nMax];
int a[nMax], n, k;
inline void Build(int nod, int st, int dr)
{
int m = (st + dr) / 2;
if(st == dr)
{
aint[nod] = a[st];
return;
}
Build(nod * 2, st, m);
Build(nod * 2 + 1, m + 1, dr);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
inline void Update(int nod, int st, int dr, int p, int val)
{
if(st == dr)
{
aint[nod] = val;
return;
}
int m = (st + dr) / 2;
if(p <= m)
Update(nod * 2, st, m, p, val);
else Update(nod * 2 + 1, m + 1, dr, p, val);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
inline int Querry(int nod, int st, int dr, int x, int y)
{
if(st == x && dr == y)
return aint[nod];
int m = (st + dr) / 2;
if(y <= m)
return Querry(nod * 2, st, m, x, y);
else
if(x > m)
return Querry(nod * 2 + 1, m + 1, dr, x, y);
else
return max(Querry(nod * 2, st, m, x ,m), Querry(nod * 2 + 1, m + 1, dr, m + 1, y));
}
inline void Read()
{
int i, p, x, y;
fin >> n >> k;
for(i = 1; i <= n; i++)
fin >> a[i];
Build(1, 1, n);
for(i = 1; i <= k; i++)
{
fin >> p >> x >> y;
if(p == 0)
fout << Querry(1, 1, n, x ,y) << "\n";
else
{
Update(1, 1, n, x ,y);
}
}
}
int main()
{
Read();
fin.close();fout.close();
return 0;
}