#include<stdio.h>
typedef struct nod{int val;
int left;
int right;
nod *st;
nod *dr;} *arb,nod;
int max(int a,int b)
{if(a>b)
return a;
return b;}
void creare(arb p,int x,int y)
{if(p==NULL)
{p=new nod;
p->left=x;
p->right=y;
p->st=NULL;
p->dr=NULL;
return;}
int div;
div=(x+y)/2;
creare(p->st,x,div);
creare(p->dr,div+1,y);
}
void init(arb p,int pos,int va)
{if(p->left==p->right)
{p->val=va;
return;}
int div=(p->left+p->right)/2;
if(pos<=div) init(p->st,pos,va);
else init(p->dr,pos,va);
p->val=max(p->st->val,p->dr->val);
}
void inter(arb p,int start,int fin,int &maxim)
{if(start<=p->left && p->right<=fin)
{if(maxim<p->val)
maxim=p->val;
return;}
int div=(p->left+p->right)/2;
if(start<=div) inter(p->st,start,fin,maxim);
if(div<fin) inter(p->dr,start,fin,maxim);
}
int main()
{arb p=NULL;
int n,m,i,j,x,y,maxim;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
creare(p,1,n);
for(i=1;i<=n;i++)
{scanf("%d",&x);
init(p,i,x);}
for(i=1;i<=m;i++)
{ scanf("%d %d %d",&j,&x,&y);
if(j==1)
init(p,x,y);
else {maxim=-1;
inter(p,x,y,maxim);
printf("%d\n",maxim);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}