#include <bits/stdc++.h>
using namespace std;
int maxim;
int aint[400001];
void update(int nod, int val ,int a, int b, int poz)
{
if ( a == b ) /// e egal si cu poz
{
aint[nod] = val;
return;
}
int mij = (a + b) >> 1;
if( poz <= mij )
{
update(2 * nod, val, a, mij , poz);
}
if(poz > mij)
update(2 * nod + 1, val, mij + 1, b, poz);
aint[nod] = max( aint[2 * nod], aint[2 * nod + 1]);
}
void query(int nod, int a, int b, int wa, int wb)
{
if(a >= wa and b <= wb)
{
maxim = max(maxim, aint[nod]);
}
else
{
int mij = (a + b) >> 1;
if (wa <= mij)
query(2 * nod, a, mij, wa, wb);
if(wb > mij)
query(2 * nod + 1, mij + 1, b, wa, wb);
}
}
int v[100001];
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, t;
cin >> n >> t;
for ( int i = 1; i <= n; i ++)
{
cin >> v[i];
update(1, v[i], 1, n, i);
}
while ( t-- )
{
int q, a, b;
cin >> q >> a >> b;
if (q == 1)
{
update(1, b, 1, n, a);
}
else
{
maxim = 0;
query(1,1,n,a,b);
cout << maxim << '\n';
}
}
return 0;
}