#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int Nmax = 100005;
int n , q , a[Nmax] , arb[4 * Nmax];
inline void Build(int node , int L , int R)
{
if(L == R)
{
arb[node] = a[L];
return;
}
int M = (L + R) / 2;
Build(2 * node , L , M);
Build(2 * node + 1 , M + 1 , R);
arb[node] = max(arb[2 * node] , arb[2 * node + 1]);
}
inline void Update(int node , int L , int R , int poz , int val)
{
if(L == R)
{
arb[node] = val;
return;
}
int M = (L + R) / 2;
if(poz <= M)
Update(2 * node , L , M , poz , val);
else Update(2 * node + 1 , M + 1 , R , poz , val);
arb[node] = max(arb[2 * node] , arb[2 * node + 1]);
}
inline int Solve(int node , int L , int R , int X , int Y)
{
if(L == X && R == Y)
return arb[node];
int M;
M = (L + R) / 2;
if(Y <= M)
return Solve(2 * node , L , M , X , Y);
else if(X > M)
return Solve(2 * node + 1 , M + 1 , R , X , Y);
else return max(Solve(2 * node , L , M , X , M) , Solve(2 * node + 1 , M + 1 , R , M + 1 , Y));
}
int main()
{
int op , x , y;
fin >> n >> q;
for(int i = 1 ; i <= n ; i++)
fin >> a[i];
Build(1 , 1 , n);
while(q -- )
{
fin >> op >> x >> y;
if(op == 0)
fout << Solve(1 , 1 , n , x , y) << "\n";
else Update(1 , 1 , n , x , y);
}
fin.close();
fout.close();
return 0;
}