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