#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct nod{
int stanga;
int dreapta;
int val;
};
int v[100005];
nod w[400005];
int maxim(int a,int b)
{
if(a>b)
return a;
else
return b;
}
void functie_creare(int pos,int stanga,int dreapta)
{
int a,b,mijl;
w[pos].stanga=stanga;
w[pos].dreapta=dreapta;
if(stanga==dreapta)
{
w[pos].val=v[stanga];
return;
}
else
{
mijl=(stanga+dreapta)/2;
functie_creare(pos*2,stanga,mijl);
functie_creare(pos*2+1,mijl+1,dreapta);
w[pos].val=maxim(w[pos*2].val,w[pos*2+1].val);
}
}
int prima_operatie(int a,int b,int pos)
{
int x,y;
int mijl=(w[pos].stanga+w[pos].dreapta)/2;
if(w[pos].stanga>=a&&w[pos].dreapta<=b)
return w[pos].val;
/* if(a==mijl&&b==mijl)
return prima_operatie(a,b,pos*2+1);
if(a<=mijl&&mijl<b)
{
x=prima_operatie(a,b,pos*2);
y=prima_operatie(a,b,pos*2+1);
return maxim(x,y);
}*/
int val2 = -1;
if(a <= mijl)
val2 = maxim(val2, prima_operatie(a,b,pos*2));
if(b > mijl)
val2 = maxim(val2, prima_operatie(a,b,pos*2+1));
return val2;
}
void modificare(int poz_cautata,int val,int pos)
{
int mijl=(w[pos].stanga+w[pos].dreapta)/2;
if(w[pos].stanga==w[pos].dreapta)
{
w[pos].val=val;
return;
}
if(poz_cautata<=mijl)
{
modificare(poz_cautata,val,pos*2);
}
else
{
modificare(poz_cautata,val,pos*2+1);
}
w[pos].val=maxim(w[pos*2].val,w[pos*2+1].val);
}
int main()
{
int n,m,i,a,b,gunoi,t;
fin>>n>>m;
for(i=0;i<n;i++)
fin>>v[i];
functie_creare(1,0,n-1);
for(i=1;i<=m;i++)
{
fin>>t>>a>>b;
a--;
if(t==0)
b--;
if(t==0)
fout<<prima_operatie(a,b,1)<<" ";
else
modificare(a,b,1);
}
return 0;
}