#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[400400];
int n,m,valnou,loc,maxi,primu,secundu;
void update(int nod, int st, int dr, int val, int pos)
{
if(st == dr){
arb[nod] = val;
}
else
{
int mij = (st + dr) / 2;
if(pos <= mij)
{
update(nod * 2, st, mij, val, pos);
}
else
{
update(nod * 2 + 1, mij + 1, dr, val, pos);
}
arb[nod] = max(arb[2*nod], arb[2*nod + 1]);
}
}
void query(int nod, int st, int dr)
{
if(primu <= st && dr <= secundu){
maxi = max(arb[nod], maxi);
}
else
{
int mij = (st + dr) / 2;
if(primu <= mij)
{
query(2*nod, st, mij);
}
if(mij < secundu)
{
query(2*nod + 1, mij + 1, dr);
}
}
}
int main() {
int i,j,k,tip,st,dr;
fin>>n>>m;
for(i = 1; i<= n; i++)
{
fin>>k;
update(1, 1, n, k, i);
}
for(i = 1; i<=m; i++)
{
fin>>tip>>st>>dr;
if(tip == 0)
{
primu = st;
secundu = dr;
maxi = INT_MIN;
query(1,1,n);
fout << maxi << '\n';
}
if(tip == 1)
{
update(1, 1, n, dr, st);
}
}
return 0;
}