#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout ("arbint.out");
int n, m;
vector<int> maxTree(2*10001+1);
int maxim = -1;
void update(int posVector, int pos, int left, int right, int val)
{
if (left == right)
{
maxTree[posVector] = val;
return;
}
int div = left + (right - left)/2;
if (pos <= div)
{
update (2*posVector, pos, left, div, val);
}
else
update(2*posVector+1, pos, div+1, right, val);
maxTree[posVector] = max (maxTree[2*posVector], maxTree[2*posVector+1]);
}
void query (int posVector, int left, int right, int a, int b)
{
if ( left >= a && right <= b)
{
if (maxim < maxTree[posVector])
{
maxim = maxTree[posVector];
}
}
else
{
int div = left + (right - left)/2;
if (a <= div) query (2*posVector, left, div, a, b);
if (b > div) query (2*posVector + 1, div+1, right, a, b);
}
}
int main()
{
int x;
int pos, value;
int y, z;
int val;
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
fin>>val;
pos = i;
update (1, pos, 1, n, val);
}
for (int i = 1; i <= m; i++)
{
fin>>x>>y>>z;
if (x == 0)
{
maxim = -1;
query (1, 1, n, y, z);
fout<<maxim<<endl;
}
else if (x == 1)
{
update (1, y, 1, n, z);
}
}
}