#include <stdio.h>
#define nmax 200000
using namespace std;
long long n,m,a[nmax],arb[1000000];
void q_max(long long nod, long long a, long long b, long long x, long long y);
void _update(long long nod, long long x,long long y,long long dest, long long val);
long long _max;
void citire()
{
freopen("arbint.in","r",stdin);
scanf("%lld %lld",&n,&m);
for (long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
}
void main_loop()
{
for (long long i=0;i<m;i++)
{
long long t,x,y;
scanf("%lld %lld %lld",&t,&x,&y);
if (t)
_update(1,1,n,x,y);
else
{
_max = a[x];
q_max(1,1,n,x,y);
printf("%lld\n",_max);
}
}
}
long long max(long long a, long long b)
{
return a>b?a:b;
}
void _update(long long nod, long long x,long long y,long long dest, long long val)
{
long long left = (nod << 1),
right = (nod << 1) +1,
mid = (x+y)>>1;
if (x>y)
return ;
if (x == y)
{
arb[nod] = val;
return;
}
if (dest <= mid)
_update(left,x,mid,dest,val);
else
_update(right,mid+1,y,dest,val);
arb[nod] = max(arb[left],arb[right]);
}
// nod contine long longervalul [a,b]
// long longervalul cautat este [x,y]
void q_max(long long nod, long long a, long long b, long long x, long long y)
{
long long left = (nod << 1),
right = (nod << 1) +1,
mid = (a+b)>>1;
if (a>b)
return;
// daca long longervalul [x,y] este inclus in [a,b]
if (a >= x && b <= y)
{
// verificam maximul
_max = arb[nod]>_max?arb[nod]:_max;
return;
}
if (x<=mid && y>=a)
q_max(left,a,mid,x,y);
if (y>mid && x<=b)
q_max(right,mid+1,b,x,y);
}
void build(long long nod,long long x, long long y)
{
long long left = (nod << 1),
right = (nod << 1) +1,
mid = (x+y)>>1;
if (x>y)
return;
if (x == y)
{
arb[nod] = a[x];
return;
}
build(left,x,mid);
build(right,mid+1,y);
arb[nod] = max(arb[left],arb[right]);
}
int main()
{
freopen("arbint.out","w",stdout);
citire();
build(1,1,n);
main_loop();
return 0;
}