#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100005;
struct Aint
{
int a[4 * NMAX];
void Update(int node, int left, int right, int pos, int val)
{
if(left == right)
{
a[node] = val;
return ;
}
int mid = (left + right) / 2;
if(pos <= mid)
Update(2 * node, left, mid, pos, val);
if(pos > mid)
Update(2 * node + 1, mid + 1, right, pos, val);
a[node] = max(a[2 * node], a[2 * node + 1]);
}
int Query(int node, int left, int right, int l, int r)
{
if(l <= left && right <= r)
return a[node];
if(l > right || r < left)
return 0;
int mid = (left + right) / 2;
int ansLeft = Query(2 * node, left, mid, l, r);
int ansRight = Query(2 * node + 1, mid + 1, right, l, r);
return max(ansLeft, ansRight);
}
};
int N, M;
Aint aint;
int main()
{
int tip, x, y;
fin >> N >> M;
for(int i = 1; i <= N; i++)
{
fin >> x;
aint.Update(1, 1, N, i, x);
}
for(int i = 1; i <= M; i++)
{
fin >> tip >> x >> y;
if(tip == 1)
aint.Update(1, 1, N, x, y);
else
fout << aint.Query(1, 1, N, x, y) << '\n';
}
return 0;
}