#include <fstream>
#include <vector>
using namespace std;
ifstream is ("arbint.in");
ofstream os ("arbint.out");
int N, M;
class SegmentTree{
int S;
vector <int> Tree;
public:
SegmentTree(vector <int> ini)
{
for (S = 1; S < ini.size(); S <<= 1);
Tree = vector<int> (2*S, 0);
for (int i = 0; i < ini.size(); ++i)
Tree[i+S] = ini[i];
for (int i = S-1; i > 0; --i)
Tree[i] = max(Tree[2*i], Tree[2*i+1]);
}
void Update(int pos, int val)
{
pos--; pos += S;
Tree[pos] = val;
for (pos >>= 1; pos > 0; pos >>= 1)
Tree[pos] = max(Tree[2*pos], Tree[2*pos+1]);
}
int Query(int L, int R)
{
int result = 0;
L--, R--;
L += S; R += S;
while (L <= R)
{
result = max(result, max(Tree[L], Tree[R]));
L = (L+1) / 2;
R = (R-1) / 2;
}
return result;
}
};
int main()
{
is >> N >> M;
vector <int> Sir = vector<int>(N);
for (int i = 0; i < N; ++i)
is >> Sir[i];
SegmentTree ST(Sir);
for (int op, x, y; M; --M)
{
is >> op >> x >> y;
if (op == 1)
ST.Update(x, y);
else
os << ST.Query(x, y) << '\n';
}
is.close();
os.close();
}