#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
struct Arbint
{
vector<int>arb;
int len = 0;
Arbint(int n)
{
arb.resize(n + 5, 0);
len = n + 5;
}
inline void update(int node, int st, int dr, int pos, int val)
{
if(st == dr)
{
arb[node] = val;
}
else
{
int mid = (st + dr) / 2;
if(pos <= mid)
update(node * 2, st, mid, pos, val);
else
update(node * 2 + 1, mid + 1, dr, pos, val);
arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}
}
inline int query(int node, int st, int dr, int arbst, int arbdr)
{
if(st > arbdr || dr < arbst)
return 0;
if(st >= arbst && dr <= arbdr)
{
return arb[node];
}
int mid = (st + dr) / 2;
return max(query(node * 2, st, mid, arbst, arbdr), query(node * 2 + 1, mid + 1, dr, arbst, arbdr));
}
};
int n, q;
Arbint arb(NMAX);
int main()
{
fin >> n >> q;
for(int i = 1; i <= n; ++ i)
{
int x;
fin >> x;
arb.update(1, 1, n, i, x);
}
while(q--)
{
bool tip;
int a, b;
fin >> tip >> a >> b;
if(!tip)
{
fout << arb.query(1, 1, n, a, b) << '\n';
}
else
{
arb.update(1, 1, n, a, b);
}
}
}