#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M, mx;
int ait[4 * NMAX], v[NMAX];
void build(int poz, int st, int dr)
{
if (st == dr)
{
ait[poz] = v[st];
return;
}
int mij = (st + dr) / 2;
build(poz * 2, st, mij);
build(poz * 2 + 1, mij + 1, dr);
ait[poz] = max(ait[2 * poz], ait[2 * poz + 1]);
}
void upd(int poz, int act, int st, int dr)
{
if (act > dr || act < st)
return;
if (st == dr && st == act)
{
ait[poz] = v[st];
return;
}
int mij = (st + dr) / 2;
upd(poz * 2, act, st, mij);
upd(poz * 2 + 1, act, mij + 1, dr);
ait[poz] = max(ait[2 * poz], ait[2 * poz + 1]);
}
void query(int poz, int lft, int rit, int st, int dr)
{
if (lft <= st && dr <= rit)
{
mx = max(mx, ait[poz]);
return;
}
if (dr < lft || st > rit)
return;
int mij = (st + dr) / 2;
query(poz * 2, lft, rit, st, mij);
query(poz * 2 + 1, lft, rit, mij + 1, dr);
}
int main()
{
fin >> N >> M;
for (int i = 1; i <= N; i++)
fin >> v[i];
build(1, 1, N);
while (M--)
{
int op, a, b;
fin >> op >> a >> b;
if (op == 1)
{
v[a] = b;
upd(1, a, 1, N);
}
else if (op == 0)
{
mx = 0;
query(1, a, b, 1, N);
fout << mx << "\n";
}
}
}