#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>
#define NMAX 100003
using namespace std;
int n,k,val;
int maxim;
int arboreMax[4 * NMAX],v[NMAX];
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void build(int nod, int st, int dr)
{
//nod e un indice din arbore
//st si dr sunt indici din vectorul v
if (st == dr)
{
//am intervalul de lungime 1 1
arboreMax[nod] = v[st];
}
else {
//parcurg intervalele din stanga si din dreapta ca la mergeSort
int mij = (st + dr) / 2;
build(2 * nod, st, mij);
build(2 * nod + 1, mij + 1, dr);
//imi iau maximul si il pun pe pozitia nod
arboreMax[nod] = max(arboreMax[2 * nod], arboreMax[2 * nod + 1]);
}
}
void query(int nod, int st, int dr, int a, int b)
{
//nod e un indice din arbore
//st,dr, a si b sunt indici din vectorul v
if (a <= st && dr <= b)
{
//intervalul meu st dr este inclus frumos in intervalul de query
maxim = max(maxim, arboreMax[nod]);
}
else {
int mij = (st + dr) / 2;
if (a<=mij)
{
//intervalul de query e la stanga de mijloc
query(2 * nod, st, mij, a, b);
}
if (mij+1<=b)
{
//am un interval bun si dupa mijloc
query(2 * nod + 1, mij + 1, dr, a, b);
}
}
}
void update(int nod, int st, int dr, int poz)
{
if (st == dr)
{
//sunt fix in casuta poz
arboreMax[nod] = val;
}
else {
int mij = (st + dr) / 2;
//ma uit sa vad pe ce interval il gasesc pe poz
if (poz <= mij)
{
//e in stanga
update(2*nod, st, mij, poz);
}
else {
//e la dreapta
update(2 * nod + 1, mij + 1, dr, poz);
}
//refac maximul de pe arbore
arboreMax[nod] = max(arboreMax[2 * nod], arboreMax[2 * nod + 1]);
}
}
int main()
{
fin >> n>>k;
for (int i = 1; i <= n; i++)
{
fin >> v[i];
}
build(1, 1, n);//imi construiesc structura de arbore
for (int i = 1; i <= k; i++)
{
int cerinta;
fin >> cerinta;
if (cerinta == 0)
{
//se va face query
int indSt, indDr;
maxim = -1;
fin >> indSt >> indDr;
query(1, 1, n, indSt, indDr);
fout << maxim << "\n";
}
else {
//se face update
int poz;
fin >> poz>>val;
v[poz] = val;
update(1, 1, n, poz);
}
}
return 0;
}