#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
int v[500005] , n , m , x , i , maxim , y , z;
void update (int nod , int left , int right , int poz , int val)
{
if (left == right)
{
v[nod] = val;
return;
}
int mij = (left + right) / 2;
if (poz <= mij)
update (2 * nod , left , mij , poz , val);
else
update (2 * nod + 1 , mij + 1 , right , poz , val);
v[nod] = max (v[2 * nod] , v[2 * nod + 1]);
}
void querry (int nod , int left , int right , int ql , int qr , int &maxim)
{
if (ql <= left && qr >= right)
{
maxim = max (maxim , v[nod]);
return;
}
int mij = (left + right) / 2;
if (ql <= mij)
querry (2 * nod , left , mij , ql , qr , maxim);
if (qr > mij)
querry (2 * nod + 1 , mij + 1 , right , ql , qr , maxim);
}
int main()
{
f >> n >> m;
for (int i = 1 ; i <= n ; i++)
{
f >> x;
update (1 , 1 , n , i , x);
}
for (int i = 1 ; i <= m ; i++)
{
f >> x >> y >> z;
if (x == 0)
{
int maxim = 0;
querry (1 , 1 , n , y , z , maxim);
g << maxim << '\n';;
}
else
update (1 , 1 , n , y , z);
}
return 0;
}