#include <stdio.h>
#include <ctype.h>
#define BUF_SIZE 131072
#define MAXP 262144
#define MAX_N 100000
#define max(a,b) a>b? a:b
int aint[MAXP],v[MAX_N+1];
char buf[BUF_SIZE],buf2[BUF_SIZE];
FILE *fin,*fout;
int pos=BUF_SIZE,pos2,left,right,maxim,poz;
inline char getch()
{
if(pos==BUF_SIZE)
{
fread(buf,BUF_SIZE,1,fin);
pos=0;
}
return buf[pos++];
}
inline int Read()
{
int x=0;
char ch=getch();
while(!isdigit(ch))
ch=getch();
do
{
x=x*10+ch-'0';
ch=getch();
} while(isdigit(ch));
return x;
}
inline void putch(char ch)
{
buf2[pos2++]=ch;
if(pos2==BUF_SIZE)
{
fwrite(buf2,BUF_SIZE,1,fout);
pos2=0;
}
}
inline void Write(int x)
{
char s[10];
int k=0;
do
{
s[k++]=x%10+'0';
x/=10;
} while(x);
while(k--)
putch(s[k]);
}
void dfs(int p,int st,int dr)
{
if(st==dr)
aint[p]=v[st];
else
{
int m=(st+dr)/2;
dfs(2*p,st,m);
dfs(2*p+1,m+1,dr);
aint[p]=max(aint[2*p],aint[2*p+1]);
}
}
void query(int p,int st,int dr)
{
if(left<=st && dr<=right)
maxim=max(maxim,aint[p]);
else
{
int m=(st+dr)/2;
if(left<=m)
query(2*p,st,m);
if(m<right)
query(2*p+1,m+1,dr);
}
}
void update(int p,int st,int dr)
{
if(st==dr)
aint[p]=v[st];
else
{
int m=(st+dr)/2;
if(poz<=m)
update(2*p,st,m);
else
update(2*p+1,m+1,dr);
aint[p]=max(aint[2*p],aint[2*p+1]);
}
}
int main()
{
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
int i,m,n,a,b,c;
n=Read();m=Read();
for(i=1;i<=n;i++)
v[i]=Read();
dfs(1,1,n);
for(i=0;i<m;i++)
{
a=Read();b=Read();c=Read();
if(!a)
{
left=b;right=c;
maxim=0;
query(1,1,n);
Write(maxim);
putch('\n');
}
else
{
poz=b;
v[b]=c;
update(1,1,n);
}
}
if(pos2)
fwrite(buf2,pos2,1,fout);
fclose(fin);
fclose(fout);
return 0;
}