#include <bits/stdc++.h>
using namespace std;
int arb[400005];
void update(int nod, int st, int dr, int i, int val)
{
if (st == dr)
{
arb[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(i <= mij)
update(2 * nod, st, mij, i, val);
else update(2 * nod + 1, mij + 1, dr, i, val);
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void query(int nod, int st, int dr, int a, int b, int &maxim)
{
if (a <= st && b >= dr)
{
maxim = max (arb[nod], maxim);
return;
}
int mij = (st + dr) / 2;
if(a <= mij) query(nod * 2, st, mij, a, b, maxim);
if(b >= mij + 1) query(nod * 2 + 1, mij + 1, dr, a, b, maxim);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, maxim, x, y, z;
int i;
f>>n>>m;
for (i = 1; i <= n; i++)
{
f>>x;
update(1, 1, n, i, x);
}
for (i = 1; i <= m; i++)
{
f>>x>>y>>z;
if (x == 0)
{
maxim = 0;
query(1, 1, n, y, z, maxim);
g<<maxim<<"\n";
} else
{
update(1, 1, n, y, z);
}
}
return 0;
}