#include <cstdio>
#include <algorithm>
using namespace std;
FILE * iFile;
FILE * oFile;
int n, m, left, right, start, finish, val, pos, maxim;
int arb[400070];
void update(int nod, int left, int right)
{
int mij;
if(right == left)
{
arb[nod] = val;
return;
}
mij = (right+left)/2;
if(pos <= mij) update(2*nod, left, mij);
else update(2*nod+1, mij+1, right);
arb[nod] = max(arb[2*nod+1], arb[2*nod]);
}
void query(int nod, int left, int right)
{
int mij;
if(start <= left && right <= finish)
{
if(maxim < arb[nod])
maxim = arb[nod];
return;
}
mij = (right+left)/2;
if(start <= mij) query(2*nod, left, mij);
if(mij < finish) query(2*nod+1, mij+1, right);
}
int main()
{
iFile = fopen("arbint.in", "r");
oFile = fopen("arbint.out", "w");
int t, a, b;
fscanf(iFile, "%d %d", &n, &m);
for(int i=1;i<=n;i++)
{
fscanf(iFile, "%d", &val);
pos = i;
update(1, 1, n);
}
for(int i=1;i<=m;i++)
{
fscanf(iFile, "%d %d %d", &t, &a, &b);
if(t == 0)
{
maxim = -1;
start = a;
finish = b;
query(1, 1, n);
fprintf(oFile, "%d\n", maxim);
} else {
pos = a, val = b;
update(1, 1, n);
}
}
fclose(iFile);
fclose(oFile);
return 0;
}