#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,v[100001];
struct nod
{
int Max,a,b;
nod *st,*dr,*f;
}*rad;
void Creare(nod *& r,nod *fa,int a, int b)
{
if( a == b )
{
r = new nod;
r->a = a;
r->b = a;
r->st = NULL;
r->dr = NULL;
r->f = fa;
r->Max = v[a];
}
else
{
r = new nod;
r->a = a;
r->b = b;
r->st = NULL;
r->dr = NULL;
r->f = fa;
Creare(r->st,r,a,(a+b)/2);
Creare(r->dr,r,(a+b)/2+1,b);
r->Max = max(r->st->Max,r->dr->Max);
}
}
void Actualizare(int x,int y)
{
nod* cap = rad;
int mij,a = 1,b = N;
while( a != b && a != x )
{
mij = (a+b)/2;
if( x <= mij )
{
b = mij;
cap = cap->st;
}
else
{
a = mij+1;
cap = cap->dr;
}
}
cap->Max = y;
cap = cap->f;
while( cap != NULL )
{
cap->Max = max(cap->st->Max,cap->dr->Max);
cap = cap->f;
}
}
int Raspuns(nod *r,int a,int b,int x,int y)
{
int mij = (a+b)/2;
if( x == a && y == b )
return r->Max;
else
{
if( x <= mij && mij < y )
return max(Raspuns(r->st,a,mij,x,mij),Raspuns(r->dr,mij+1,b,mij+1,y));
else
if( x <= mij && y <= mij )
return Raspuns(r->st,a,mij,x,y);
else
if( x > mij && y > mij )
return Raspuns(r->dr,mij+1,b,x,y);
}
return -1;
}
int main()
{
int p,x,y;
f>>N>>M;
for(int i = 1 ; i <= N ; i++)
f>>v[i];
Creare(rad,rad,1,N);
rad->f = NULL;
for(int i = 1 ; i <= M ; i++)
{
f>>p>>x>>y;
if( p == 1 )
{
Actualizare(x,y);
v[x] = y;
}
else
g<<Raspuns(rad,1,N,x,y)<<'\n';
}
return 0;
}