#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 1 << 18;
const int mn = -1;
int16_t c;
int arb[N], a, b, n, m, z, i;
int getmax(int, int, int);
void modif();
int main()
{
f >> n >> m;
z = 1;
while(z < n) z *= 2;
z--;
for(i = 1; i <= n; i++)
f >> arb[i + z];
for(i = z + n + 1; i <= 2 * z + 2; i++)
arb[i] = mn;
for(i = z; i; i--)
arb[i] = max(arb[2 * i], arb[2 * i + 1]);
for (; m; m--)
{
f >> c >> a >> b;
if(c == 0) g << getmax(1, 1, z + 1) << '\n';
else
modif();
}
return 0;
}
int getmax(int nod, int st, int dr){
if(b < st || a > dr) return mn;
if(a <= st && dr <= b) return arb[nod];
int mi = (st + dr) / 2;
return max(getmax(2 * nod, st, mi), getmax(2 * nod + 1, mi + 1, dr));
}
void modif(){
int k = z + a;
arb[k] = b;
while(k){
k /= 2;
arb[k] = max(arb[2 * k], arb[2 * k + 1]);
}
}