#include <stdio.h>
int t[1<<15],m,n;
int pos, val, i, l, r, x, max;
void update(int,int,int);
void query (int,int,int);
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i)
{
scanf("%d", &val);
pos = i;
update(1,1,n);
}
for(; m; --m)
{
scanf("%d %d %d", &x, &l, &r);
if(!x)
{
max = 0;
query(1,1,n);
printf("%d\n", max);
}
else
{
pos = l;
val = r;
update(1,1,n);
}
}
return 0;
}
void update (int nod, int st, int dr){
if(st == dr){
t[nod] = val;
return;
}
int mid = (st + dr) / 2;
if(pos <= mid)
update (2 * nod, st, mid);
else
update (2 * nod + 1, mid+1, dr);
if(t[2*nod]>t[2*nod+1])
t[nod] = t[2*nod];
else
t[nod] = t[2*nod+1];
}
void query (int nod, int st, int dr){
if(l <= st && dr <= r){
if(max < t[nod])
max = t[nod];
return;
}
int mid = (st + dr) / 2;
if (l <= mid)
query(2 * nod, st, mid);
if (r > mid)
query(2 * nod + 1, mid + 1, dr);
}