#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int Nmax=100000;
int N, M, Max;
int v[Nmax+5], AINT[4*Nmax+5];
void Read()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>v[i];
}
}
void Update(int i, int Left, int Right, int a, int b)
{
if(Left==Right)
{
AINT[i]=b;
return;
}
int Mid=(Left+Right)/2;
if(a<=Mid)
Update(2*i, Left, Mid, a, b);
else
Update(2*i+1, Mid+1, Right, a, b);
AINT[i]=max(AINT[2*i], AINT[2*i+1]);
}
void Build()
{
for(int i=1;i<=N;i++)
Update(1, 1, N, i, v[i]);
}
void Query(int i, int Left, int Right, int a, int b)
{
if(a<=Left && Right<=b)
{
Max=max(Max, AINT[i]);
return;
}
if(a>Right || b<Left)
return;
int Mid=(Left+Right)/2;
Query(2*i, Left, Mid, a, b);
Query(2*i+1, Mid+1, Right, a, b);
}
void Solve()
{
for(int i=1;i<=M;i++)
{
int op, a, b;
cin>>op>>a>>b;
if(op==1)
Update(1, 1, N, a, b);
else
{
Max=-1;
Query(1, 1, N, a, b);
cout<<Max<<'\n';
}
}
}
int main()
{
Read();
Build();
Solve();
return 0;
}