#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,v[100003],poz[100003];
struct arbore_interval
{
int M;
}I[600003];
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].M = v[a];
//I[nod].D = 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].M = max(I[left_son(nod)].M,I[right_son(nod)].M);
//I[nod].D = I[left_son(nod)].D + I[right_son(nod)].D;
}
}
arbore_interval Rezultat(int nod,int a,int b,int x,int y)
{
arbore_interval s; //s.D=0; s.M=0;
if( a == x && b == y )
{
s.M = I[nod].M;
//s.D = I[nod].D;
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 )
{
arbore_interval s1,s2;
s1 = Rezultat(left_son(nod),a,mij,x,mij);
s2 = Rezultat(right_son(nod),mij+1,b,mij+1,y);
s.M = max(s1.M,s2.M);
//s.D = s1.D + s2.D;
return s;
}
}
return s;
}
void Actualizare(int nod,int val,int y)
{
I[nod].M = y;
//I[nod].D = y;
nod = father(nod);
while( nod != 0 )
{
I[nod].M = max(I[left_son(nod)].M,I[right_son(nod)].M);
//I[nod].D = I[nod].D - val + y;
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
{
arbore_interval s;
s = Rezultat(1,1,n,x,y);
g<< s.M <<'\n';
}
}
return 0;
}