#include<cstdio>
using namespace std;
int arb[400066];
int val, poz, n, m, x, y, maxim, k, i;
int max(int a,int b)
{
if(a>b) return a;
return b;
}
void update(int nod, int st, int dr)
{
if(st == dr)
{
arb[nod] = val;
return;
}
int med = (st + dr) / 2;
if(med >= poz)
update(nod*2, st, med);
else
update(nod*2+1, med+1, dr);
arb[nod] = max(arb[nod*2], arb[nod*2+1]);
}
void query(int nod, int st, int dr)
{
if(st >= x && dr <= y)
{
maxim = max(maxim, arb[nod]);
return;
}
int med = (st + dr) / 2;
if(med >= x)
query(nod*2, st, med);
if(y>med)
query(nod*2+1, med+1, dr);
}
int main()
{
FILE *fin,*fout;
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
fscanf(fin,"%d%d",&n,&m);
for(i = 1; i <= n; ++i)
{
fscanf(fin,"%d",&val);
poz = i;
update(1, 1, n);
}
while(m--)
{
fscanf(fin,"%d",&k);
if(k == 1)
{
fscanf(fin,"%d%d",&poz,&val);
update(1, 1, n);
}
else
{
fscanf (fin,"%d%d",&x,&y);
maxim = 0;
query(1, 1, n);
fprintf(fout,"%d\n",maxim);
}
}
return 0;
}