#include <algorithm>
#include <fstream>
#define INF (2000000000)
#define MIJ ((st+dr)/2)
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[202000],x[102000],i,j,a,b,op,maxim,frunze[102000],n,m;
void set_frunze(int nod, int st, int dr)
{
if(st == dr)
frunze[st] = nod;
else if(st < dr)
set_frunze(2*nod, st, MIJ),
set_frunze(2*nod+1, MIJ+1, dr);
}
void query(int nod, int st, int dr, int ist, int idr)
{
if(st > idr || dr < ist)
return;
if(ist <= st && idr >= dr)
{
if(maxim < arb[nod])
maxim = arb[nod];
return;
}
if(!(st > idr || MIJ < ist))
query(2*nod, st, MIJ, ist, idr);
if(!(MIJ+1 > idr || dr < ist))
query(2*nod+1, MIJ+1, dr, ist, idr);
}
void update(int pos)
{
int nod = frunze[pos];
int st,dr, m;
st = dr = pos;
arb[nod] = x[pos];
nod/=2;
while(nod>=1)
arb[nod] = max(arb[2*nod], arb[2*nod+1]), nod/=2;
}
int main()
{
in>>n>>m;
set_frunze(1, 1, n);
for(i=1; i<=n; i++)
in>>x[i], update(i);
for(i=1; i<=m; i++)
{
in>>op>>a>>b;
if(op == 0)
{
maxim = -INF;
query(1, 1, n, a, b);
out<<maxim<<'\n';
}
else
{
x[a] = b;
update(a);
}
}
return 0;
}