#include <stdio.h>
#include <algorithm>
#include <iostream>
#define nMax 100001
using namespace std;
int n, m;
int MaxArb[4*nMax+66];
int start, finish;
int val, poz, maxim;
void Update(int nod, int left, int right)
{
if(left == right)
{
MaxArb[nod] = val;
return;
}
int mij = (right + left)/2;
if(poz <= mij)
Update(2*nod, left, mij);
else
Update(2*nod+1, mij+1, right);
MaxArb[nod] = max( MaxArb[2*nod], MaxArb[2*nod+1] );
}
void Query(int nod, int left, int right)
{
if( left >= start && finish >= right)
{
maxim = max(maxim, MaxArb[nod]);
return;
}
int mij = (left + right)/2;
if(start <= mij) Query(2*nod, left, mij);
if(mij < finish) Query(2*nod+1, mij+1, right);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d\n", &n, &m);
int x;
for(int i=1; i<=n; ++i)
{
scanf("%d ", &x);
poz = i;
val = x;
Update(1, 1, n);
}
scanf("\n");
for(int i=1; i<=m; ++i)
{
int chs, a, b;
scanf("%d %d %d\n", &chs, &a, &b);
if(chs == 0)
{
maxim = -1;
start = a;
finish = b;
Query(1, 1, n);
printf("%d\n", maxim);
}
else if(chs == 1)
{
val = b;
poz = a;
Update(1, 1, n);
}
}
return 0;
}