#include <stdio.h>
long i,m,n,x,a,b,arbInt[450000],maxx;
long max(long x,long y)
{if(x<y)return y;else return x;}
void add(long nod, long stanga, long dreapta,long loc,long valoare)
{if (stanga == dreapta)
{arbInt[nod] = valoare;return;}
int median = (stanga + dreapta) / 2;
if (loc <= median) add(nod * 2, stanga, median, loc, valoare);
else add(nod * 2 + 1, median + 1, dreapta, loc, valoare);
arbInt[nod] = max(arbInt[nod * 2], arbInt[nod * 2 + 1]);
}
long query(long nod, long stanga, long dreapta, long st, long fn)
{
if (st <= stanga && dreapta <= fn)
return arbInt[nod];
long median = (stanga + dreapta) / 2;
long minim = 0;
if (st <= median)
minim = max(minim, query(2 * nod, stanga, median, st, fn));
if (median < fn)
minim = max(minim, query(2 * nod + 1, median + 1, dreapta, st, fn));
return minim;
}
int main()
{freopen("arbint.in","r",stdin);freopen("arbint.out","w",stdout);
fscanf(stdin,"%ld%ld",&n,&m);
for(i=1;i<=n;i++){fscanf(stdin,"%ld",&x);add(1,1,n,i,x);}
for(i=1;i<=m;i++)
{fscanf(stdin,"%ld%ld%ld",&x,&a,&b);
if(x)add(1,1,n,a,b);
else {maxx=query(1,1,n,a,b);fprintf(stdout,"%ld\n",maxx);}
}
fclose(stdin);fclose(stdout);
return 0;
}