#include<stdio.h>
#include<algorithm>
using namespace std;
FILE *in,*out;
//constante
const int Nmax=(int)4e5+1;
//definitii
#define leftSon 2*nod
#define rightSon 2*nod+1
//functii
void arb(int nod,int left,int right);
void query(int nod,int left,int nod);
//variabile
int n,questions;
int poz,val;
int tree[Nmax];
int tip,lim1,lim2;
int main(void)
{
in=fopen("arbint.in","rt");
out=fopen("arbint.out","wt");
fscanf(in,"%d%d",&n,&questions);
for(poz=1;poz<=n;++poz)
{
fscanf(in,"%d",&val);
arb(1,1,n);
}
for(int i=1;i<=questions;++i)
{
fscanf(in,"%d",&tip);
if(tip)
{
fscanf(in,"%d%d",&poz,&val);
arb(1,1,n);
}
else
{
fscanf(in,"%d%d",&lim1,&lim2);
val=0;
query(1,1,n);
fprintf(out,"%d\n",val);
}
}
fclose(in);
fclose(out);
return 0;
}
void arb(int nod,int left,int right)
{
if(left==right)
{
tree[nod]=val;
return;
}
int mid=(left+right)/2;
if(poz<=mid)
arb(leftSon,left,mid);
else
arb(rightSon,mid+1,right);
tree[nod]=max(tree[leftSon],tree[rightSon]);
}
void query(int nod,int left,int right)
{
if(lim1<=left && right<=lim2)
{
val=max(val,tree[nod]);
return;
}
int mid=(left+right)/2;
if(lim1<=mid)
query(leftSon,left,mid);
if(mid<lim2)
query(rightSon,mid+1,right);
}