#include <fstream>
using namespace std;
//ifstream fin("arbint.in");
//ofstream fout("arbint.out");
int v[400080];
int maxim;
void update(int nod, int poz, int x, int st, int dr)
{
if(st==dr) v[nod]=x;
else
{
int m=(st+dr)/2;
if(poz<=m) update(2*nod, poz, x, st, m);
else update(2*nod+1, poz, x, m+1, dr);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
}
void query(int nod, int st, int dr, int a, int b)
{
int m1=0, m2=0;
if(st>=a && dr<=b)
{
if(maxim<v[nod]) maxim=v[nod];
return;
}
else
{
int m=(st+dr)/2;
if(m>=a)
{
query(2*nod, st, m, a, b);
}
if(m<b)
{
query(2*nod+1, m+1, dr, a, b);
}
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int k, a, b, n, m;
//fin>>n>>m;
scanf("%i%i", &n,&m);
for(int i=1; i<=n; i++)
{
//fin>>k;
scanf("%i", &k);
update(1,i,k,1,n);
}
for(int i=1; i<=m; i++)
{
//fin>>k>>a>>b;
scanf("%i%i%i", &k,&a,&b);
if(k==0)
{
query(1,1,n,a,b);
printf("%i%c",maxim,'\n');//fout<<query(1,1,n,a,b)<<'\n';
maxim=0;
}
else
update(1,a,b,1,n);
}
return 0;
}