#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax = 100005;
int n, m;
int a[nmax];
int aint[nmax*3];
inline void build(int nod, int st, int dr)
{
if (st == dr)
{
aint[nod] = a[st];
return;
}
int mij = (st + dr)/2;
build(2*nod, st, mij);
build(2*nod+1, mij+1, dr);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
inline void update(int nod,int st, int dr, int pos, int val)
{
if (st == dr)
{
aint[nod] = val;
return;
}
int mij = (st+dr)/2;
if (pos <= mij)
update(2*nod, st, mij, pos, val);
else
update(2*nod+1, mij+1, dr, pos, val);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
inline int querry(int nod, int st, int dr, int l, int r)
{
if (st >= l && dr <= r)
return aint[nod];
int mij = (st+dr)/2;
int ans = 0;
if (l <= mij)
ans = max(ans, querry(2*nod, st, mij, l, r));
if (mij < r)
ans = max(ans, querry(2*nod+1, mij+1, dr, l, r));
return ans;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> a[i];
build(1, 1, n);
while (m--)
{
int p, a, b;
fin >> p >> a >> b;
if (p)
update(1, 1, n, a, b);
else
{
fout << querry(1, 1, n, a, b) << "\n";
}
}
return 0;
}