#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[250000];
int maxim(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int 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 v[stanga];
}
else
{
mijl=(stanga+dreapta)/2;
a=functie_creare(pos*2+1,stanga,mijl);
b=functie_creare(pos*2+2,mijl+1,dreapta);
w[pos].val=maxim(a,b);
return w[pos].val;
}
return 0;
}
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+1);
y=prima_operatie(a,b,pos*2+2);
return maxim(x,y);
}
if(mijl<a)
return prima_operatie(a,b,pos*2+2);
if(mijl>=b)
return prima_operatie(a,b,pos*2+1);
return 0;
}
int modificare(int poz_cautata,int val,int pos)
{
int mijl=(w[pos].stanga+w[pos].dreapta)/2;
int x,y;
if(w[pos].stanga==poz_cautata&&w[pos].dreapta==poz_cautata)
{
w[pos].val=val;
return val;
}
if(poz_cautata<=mijl)
{
x=modificare(poz_cautata,val,pos*2+1);
y=w[pos*2+2].val;
w[pos].val=maxim(x,y);
return w[pos].val;
}
if(poz_cautata>mijl)
{
x=modificare(poz_cautata,val,pos*2+2);
y=w[pos*2+1].val;
w[pos].val=maxim(x,y);
return w[pos].val;
}
return 0;
}
int main()
{
int n,m,i,a,b,gunoi,t;
fin>>n>>m;
for(i=0;i<n;i++)
fin>>v[i];
gunoi=functie_creare(0,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,0)<<"\n";
else
gunoi=modificare(a,b,0);
}
return 0;
}