#include <cstdio>
#include <cstdlib>
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
#define INF 0x3f3f3f3f
int v[100000];
int a[0x40000];
void act(int nod, int st, int en,int i, int nr)
{
if (st==en)
{
if (st==i)
a[nod]=nr;
} else {
int mij = (st+en)/2;
if (i<=mij)
act(nod*2+1,st,mij,i,nr);
else
act(nod*2+2,mij+1,en,i,nr);
int max = 0;
if (a[nod*2+1]>max)
max = a[nod*2+1];
if (a[nod*2+2]>max)
max = a[nod*2+2];
a[nod]=max;
}
}
int max;
void query(int nod,int st, int en, int aa, int bb)
{
if ((aa<=st) && (en<=bb))
{
if (a[nod]>max)
max=a[nod];
} else {
int mij = (st+en)/2;
if (aa<=mij)
query(nod*2+1,st,mij,aa,bb);
if (mij<bb)
query(nod*2+2,mij+1,en,aa,bb);
}
}
int main (int argc, char * const argv[]) {
int n,m;
fscanf(fin, "%d%d", &n, &m);
for (int i=0; i<n; i++)
{
int x;
fscanf(fin, "%d", &x);
act(0,0,n-1,i,x);
}
for (int i=0; i<m; i++)
{
int c,a,b;
fscanf(fin, "%d%d%d",&c,&a,&b);
if (c==0)
{
a--; b--;
max = 0;
query(0, 0, n-1, a, b);
fprintf(fout, "%d\n",max);
} else {
a--;
act(0, 0, n-1, a, b);
}
}
fclose(fin);
fclose(fout);
return 0;
}