#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,v[100053],poz[100053];
int I[200053];
inline int father(int nod)
{
return nod/2;
}
inline int left_son(int nod)
{
return nod*2;
}
inline int right_son(int nod)
{
return nod*2+1;
}
void Creare(int nod,int a,int b)
{
if( a == b )
{
I[nod] = v[a];
poz[a] = nod;
}
else
{
int mij = (a+b)/2;
Creare(left_son(nod),a,mij);
Creare(right_son(nod),mij+1,b);
I[nod] = max(I[left_son(nod)],I[right_son(nod)]);
}
}
int Rezultat(int nod,int a,int b,int x,int y)
{
int s=0;
if( a == x && b == y )
{
s = I[nod];
return s;
}
else
{
int mij = (a+b)/2;
if( x <= mij && y <= mij )
return Rezultat(left_son(nod),a,mij,x,y);
else
if( x > mij && y > mij )
return Rezultat(right_son(nod),mij+1,b,x,y);
else
if( x <= mij && y > mij )
{
int s1,s2;
s1 = Rezultat(left_son(nod),a,mij,x,mij);
s2 = Rezultat(right_son(nod),mij+1,b,mij+1,y);
s = max(s1,s2);
return s;
}
}
return s;
}
void Actualizare(int nod,int val,int y)
{
I[nod] = y;
nod = father(nod);
while( nod != 0 )
{
I[nod] = max(I[left_son(nod)],I[right_son(nod)]);
nod = father(nod);
}
}
int main()
{
int tip,x,y;
f>>n;
f>>m;
for(int i = 1 ; i <= n ; i++)
f>>v[i];
Creare(1,1,n);
for(int i = 1 ; i <= m ; i++)
{
f>>tip>>x>>y;
if( tip == 1 )
{
Actualizare(poz[x],v[x],y);
v[x] = y;
}
else
{
int s;
s = Rezultat(1,1,n,x,y);
g<< s <<'\n';
}
}
return 0;
}