// arbint2.cpp : Defines the entry point for the console application.
//
#include <cstdio>
#include<iostream>
using namespace std;
const int NMAX = 100010;
int N, M;
int A[NMAX];
int Arb[NMAX * (1 << 2)];
int query(int creanga, int st, int dr, int l1, int l2)
{
int x, y;
if(l1 <= st && dr <= l2)
return Arb[creanga];
int mij = (st + dr) / 2;
if(l1 <= mij)
x = query(creanga*2, st, mij, l1, l2);
if(mij + 1 <= l2)
y = query(creanga*2 + 1, mij + 1, dr, l1, l2);
return max(x, y);
}
void update(int creanga ,int st, int dr, int poz, int x)
{
if(st == dr)
{
Arb[creanga] = x;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
update(2 * creanga, st, mij, poz, x);
else
update(2 * creanga + 1, mij + 1, dr, poz, x);
Arb[creanga] = max(Arb[2*creanga], Arb[2*creanga + 1]);
}
void citire()
{
int a, b, iden;
cin >> N >> M;
for(int i = 1 ; i <= N ; i++)
{
cin >> A[i];
update(1, 1, N, i, A[i]);
}
for(int i = 1 ; i <= M ; i++)
{
cin >> iden;
if(iden == 0)
{
cin >> a >> b;
printf("%d\n", query(1, 1, N, a, b));
}
else
{
cin >> a >> b;
update(1, 1, N, a, b);
}
}
}
int main()
{
freopen("arbint2.in","r",stdin);
freopen("arbint2.out","w",stdout);
citire();
return 0;
}