#include <stdio.h>
#include <stdlib.h>
#define dim 100000
typedef struct nod{
int val;
struct nod *st,*dr;
}nod_t;
void print_tree(nod_t *tree){
if(tree){
print_tree(tree->st);
print_tree(tree->dr);
printf("%d ",tree->val);
}
}
int maxim(int a,int b){
return (a<b)?b:a;
}
nod_t* update_tree(nod_t *tree,int st,int dr,int pos,int val){
if(tree==NULL){
tree=malloc(sizeof(nod_t));
tree->val=0;
tree->st=NULL;
tree->dr=NULL;
}
if(st==dr){
tree->val=val;
return tree;
}
int m=(st+dr)/2;
if(pos<=m){
tree->st=update_tree(tree->st,st,m,pos,val);
}
else{
tree->dr=update_tree(tree->dr,m+1,dr,pos,val);
}
if(tree->st && tree->dr){
tree->val=maxim(tree->st->val,tree->dr->val);
}
else if(tree->st){
tree->val=tree->st->val;
}
else if(tree->dr){
tree->val=tree->dr->val;
}
return tree;
}
void search(nod_t *tree,int st,int dr,int a,int b,int *_maxim){
if(a<=st && dr<=b){
*_maxim=maxim(*_maxim,tree->val);
return;
}
int m=(st+dr)/2;
if(a<=m && tree->st){
search(tree->st,st,m,a,b,_maxim);
}
if(m<b && tree->dr){
search(tree->dr,m+1,dr,a,b,_maxim);
}
}
int main()
{
FILE *f,*g;
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
nod_t *tree=NULL;
int n,m;
fscanf(f,"%d",&n);
fscanf(f,"%d",&m);
for(int i=0;i<n;++i){
int a;
fscanf(f,"%d",&a);
tree=update_tree(tree,0,n-1,i,a);
}
for(int i=0;i<m;++i){
int x,a,b;
fscanf(f,"%d%d%d",&x,&a,&b);
if(x==0){
int _maxim=-1;
search(tree,0,n-1,a-1,b-1,&_maxim);
fprintf(g,"%d\n",_maxim);
}
else{
update_tree(tree,0,n-1,a-1,b);
}
}
fclose(f);
fclose(g);
return 0;
}