#include <stdio.h>
#define MAXN 100001
long long arbore[4 * MAXN];
int n,m;
void creare(long long *a,int nod,int l,int r)
{
if (l==r)
{
arbore[nod]=a[l];
return;
}
int mid=(l+r)/2;
creare(a,2*nod,l, mid);
creare(a,2*nod+1,mid+1,r);
arbore[nod]=arbore[2*nod]>arbore[2*nod+1]?arbore[2*nod]:arbore[2*nod+1];
}
void update(int nod,int l,int r,int pos,long long val)
{
if (l == r)
{
arbore[nod]=val;
return;
}
int mid=(l+r)/2;
if (pos<=mid)
update(2*nod,l,mid,pos,val);
else
update(2*nod+1,mid+1,r,pos,val);
arbore[nod] = arbore[2*nod]>arbore[2*nod+1]?arbore[2*nod]:arbore[2*nod+1];
}
long long query(int nod,int l,int r,int ql,int qr)
{
if (ql<=l && r<=qr) return arbore[nod];
int mid=(l+r)/2;
long long res=-1;
if (ql<=mid)
{
long long left=query(2*nod,l,mid,ql,qr);
if (left>res) res=left;
}
if (qr>mid)
{
long long right=query(2*nod+1,mid+1,r,ql,qr);
if (right>res) res=right;
}
return res;
}
int main() {
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
fscanf(fin,"%d %d",&n,&m);
long long a[MAXN];
int i;
for (i=1; i<=n;i++) fscanf(fin,"%lld",&a[i]);
creare(a,1,1,n);
while (m--)
{
int tip,x,y;
fscanf(fin,"%d %d %d",&tip,&x,&y);
if (tip==0) fprintf(fout,"%lld\n",query(1,1,n,x,y));
else update(1,1,n,x,(long long)y);
}
fclose(fin);
fclose(fout);
return 0;
}