#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arbore[400005], v[100005];
int n, m;
void construire(int k, int st, int dr)
{
if(st == dr)
arbore[k] = v[st];
else
{
int mij = (st + dr) / 2;
construire(2 * k, st, mij);
construire(2 * k + 1, mij + 1, dr);
arbore[k] = max(arbore[2 * k], arbore[2 * k + 1]);
}
}
int get_maxim(int k, int a, int b, int st, int dr)
{
if(st >= a && dr <= b)
return arbore[k];
if(dr < a || st > b)
return -1;
int mij = (st + dr) / 2;
return max(get_maxim(2 * k, a, b, st, mij), get_maxim(2 * k + 1, a, b, mij + 1, dr));
}
void schimba_val(int k, int a, int b, int st, int dr)
{
if(st == dr)
arbore[k] = b;
else
{
int mij = (st + dr) / 2;
if(a <= mij)
schimba_val(2 * k, a, b, st, mij);
else
schimba_val(2 * k + 1, a, b, mij + 1, dr);
arbore[k] = max(arbore[2 * k], arbore[2 * k + 1]);
}
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
construire(1, 1, n);
for(int i = 1; i <= m; i++)
{
int q, a, b;
fin >> q >> a >> b;
if(q == 0)
fout << get_maxim(1, a, b, 1, n) << '\n';
else
schimba_val(1, a, b, 1, n);
}
return 0;
}