#include <fstream>
using namespace std ;
ifstream fin("arbint.in") ;
ofstream fout("arbint.out") ;
const int NMAX = 100000005 ;
int N, Q, arb[NMAX], A[NMAX], sol ;
void Update(int left, int right, int node, int index)
{
int middle = (left + right) / 2 ;
if(left == right)
{
arb[node] = A[index] ;
return ;
}
if(index <= middle)
Update(left, middle, 2 * node, index) ;
else Update(middle + 1, right, 2 * node + 1, index) ;
arb[node] = max(arb[2 * node], arb[2 * node + 1]) ;
}
void Query(int left, int right, int node, int X, int Y)
{
int middle = (left + right) / 2 ;
if(left >= X && right <= Y)
{
sol = max(sol, arb[node]) ;
return ;
}
if(X <= middle)
Query(left, middle, 2 * node, X, Y);
if(Y > middle)
Query(middle + 1, right, 2 * node + 1, X, Y) ;
}
int main()
{
fin >> N >> Q ;
for(int i = 1 ; i <= N ; ++ i )
{
fin >> A[i] ;
Update(1, N, 1, i) ;
}
while(Q --)
{
int x, a, b;
fin >> x >> a >> b ;
if(!x)
{
sol = 0 ;
Query(1, N, 1, a, b) ;
fout << sol << '\n' ;
}
else
{
A[a] = b ;
Update(1, N, 1, a) ;
}
}
fin.close() ;
fout.close() ;
return 0 ;
}