#include<cstdio>
using namespace std;
const int MAXN = 300010;
int arb[MAXN], x, a, b, M, N, val, poz;
inline int maxim(int a, int b){
if(a > b)
return a;
return b;
}
void update(int p, int st, int dr)
{
if(st == dr){
arb[p] = val;
return;
}
int mij = (st+dr)/2;
if(poz <= mij)
update(2*p, st, mij);
else
update(2*p+1, mij+1, dr);
arb[p] = maxim(arb[2*p], arb[2*p+1]);
}
int query(int p, int st, int dr)
{
if(a<=st && dr<=b)
return arb[p];
int mij = (st + dr)/2, rez = 0;
if(a <= mij)
rez = maxim(rez, query(2*p, st, mij));
if(mij < b)
rez = maxim(rez, query(2*p+1, mij+1, dr));
return rez;
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int i;
scanf("%d%d", &N, &M);
for(i=1; i<=N; ++i)
{
scanf("%d", &x);
poz = i;
val = x;
update(1, 1, N);
}
for(i=1; i<=M; ++i)
{
scanf("%d %d %d", &x, &a, &b);
if(x == 0){
val = query(1, 1, N);
printf("%d\n", val);
}
else
{
poz = a;
val = b;
update(1, 1, N);
}
}
return 0;
}