#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int arb[400001];
int v[100001];
int maxx;
void build ( int nod, int st, int dr )
{
if ( st == dr )
{
arb[nod] = v[st];
return;
}
int mij = ( st + dr ) / 2;
build ( nod * 2, st, mij );
build ( nod * 2 + 1, mij + 1, dr );
arb[nod] = max ( arb[nod * 2], arb[nod * 2 + 1] );
}
void update ( int nod, int st, int dr, int poz, int val )
{
if ( st == dr )
{
arb[nod] = val;
return;
}
int mij = ( st + dr ) / 2;
if ( poz <= mij )
update ( 2 * nod, st, mij, poz, val );
else update ( 2 * nod + 1, mij + 1, dr, poz, val );
arb[nod] = max ( arb[nod * 2], arb[nod * 2 + 1] );
}
void query ( int nod, int st, int dr, int a, int b )
{
if ( st > b || dr < a )
return;
if ( a <= st && dr <= b )
{
maxx = max ( maxx, arb[nod] );
return;
}
int mij = ( st + dr ) / 2;
query ( 2 * nod, st, mij, a, b );
query ( 2 * nod + 1, mij + 1, dr, a, b );
}
int main()
{
int n, q;
f >> n >> q;
for ( int i = 1; i <= n; i ++ )
f >> v[i];
build ( 1, 1, n );
while ( q -- )
{
int tip, a, b;
f >> tip >> a >> b;
if ( tip == 0 )
{
maxx = -1;
query ( 1, 1, n, a, b );
g << maxx << '\n';
}
else update ( 1, 1, n, a, b );
}
return 0;
}