#include <stdio.h>
#include <string.h>
#define NMAX 100008
int v[NMAX];
int m[NMAX*2+1];
inline int max(int a, int b)
{
if (a>b) return a;
return b;
}
void schimba (int nod, int poz, int val, int st, int dr)
{
if (poz==st&&poz==dr) m[nod]=val;
else
{
int mij=(st+dr)/2;
if (poz<=mij) schimba(2*nod,poz,val,st,mij);
else
{
schimba(2*nod+1,poz,val,mij+1,dr);
}
m[nod]=max(m[2*nod],m[2*nod+1]);
}
}
int maxim(int nod, int a, int b, int st, int dr)
{
if (a==st && b==dr) return m[nod];
else
{
int mij=(st+dr)/2;
if (a<=mij)
if (b>mij) return max(maxim(2*nod,a,mij,st,mij),maxim(2*nod+1,mij+1,b,mij+1,dr));
else return maxim(2*nod,a,b,st,mij);
else return maxim(2*nod+1,a,b,mij+1,b);
}
}
int main()
{
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
int n,i,ev;
fscanf(fin,"%d %d",&n,&ev);
for (i=1;i<=n;i++) fscanf(fin,"%d",&v[i]);
// int Na=2*n+1;
memset (m,0,sizeof(m));
for (i=1;i<=n;i++)
schimba(1,i,v[i],1,n);
int a,b,tip;
while (ev--)
{
fscanf(fin,"%d %d %d",&tip,&a,&b);
if (tip==0) fprintf(fout,"%d\n",maxim(1,a,b,1,n));
else schimba(1,a,b,1,n);
}
fclose(fin); fclose(fout);
return 0;
}