//Arbori de intervale
#include <stdio.h>
#define INPUT "arbint.in"
#define OUTPUT "arbint.out"
#define NMAX 100001
#define max(a,b) ((a)>(b)?(a):(b))
int N, M;
int arbmax[NMAX*2];
int val, pos;
int start, fin, maxim;
void update(int nod, int st, int dr)
{
if(st == dr)
{
arbmax[nod] = val;
return;
}
int mij = (st+dr)/2;
if(pos<=mij) update(nod<<1, st, mij);
else update((nod<<1)+1, mij+1, dr);
arbmax[nod] = max(arbmax[nod<<1], arbmax[(nod<<1)+1]);
}
void query(int nod, int st, int dr)
{
if(start <= st && dr <= fin)
{
maxim = max(maxim, arbmax[nod]);
return;
}
int mij = (st+dr)/2;
if(start<=mij) query(nod<<1, st, mij);
if(fin>mij) query((nod<<1)+1, mij+1, dr);
}
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
scanf("%d %d", &N, &M);
int i;
for(i = 1; i <= N; ++i)
{
scanf("%d", &val);
pos = i;
update(1, 1, N);
}
for(i = 1; i <= M; ++i)
{
int tip, x, y;
scanf("%d %d %d", &tip, &x, &y);
if(tip == 0)
{
start = x; fin = y; maxim = -1;
query(1, 1, N);
printf("%d\n", maxim);
}
else
{
pos = x; val = y;
update(1, 1, N);
}
}
return 0;
}