#include <iostream>
#include <fstream>
#include <algorithm>
#include <assert.h>
std::ifstream f("arbint.in");
std::ofstream g("arbint.out");
int A[700004], qst, qdr, md, nod=1, rez;
int p2[700000];
int max(const int &a, const int &b)
{
return a>b?a:b;
}
int query(int nod, int st, int dr)
{
if(p2[dr-st+1]==0)
{
nod++;
nod--;
}
if(qst<=st && dr<=qdr)
return A[nod];
else if(qdr<st||dr<qst)
return 0;
else
{
md=(st+dr)/2;
return max(query(2*nod, st, md),query(2*nod+1, md+1, dr));
}
}
void update(int nod, int st, int dr, int poz, int val)
{
if(p2[dr-st+1]==0)
{
nod++;
nod--;
}
if(st==dr)
A[nod]=val;
else
{
md=(st+dr)/2;
if(poz<=md)
update(2*nod, st, md, poz, val);
else
update(2*nod+1, md+1, dr, poz, val);
A[nod]=A[2*nod] > A[2*nod+1] ? A[2*nod] : A[2*nod+1] ;
}
}
int main()
{
int N, M, i, put, a, b, op, dr, x;
f>>N>>M;
dr=1;
p2[1]=1;
for(put=0; dr<N; put++)
{
dr=2*dr;
p2[dr]=1;
}
for(i=1; i<=N; i++)
{
f>>x;
update(1, 1, dr, i, x);
}
for(i=1; i<=M; i++)
{
f>>op>>a>>b;
if(op==1)
update(1, 1, dr, a, b);
else
{
rez=0;
qst=a;
qdr=b;
g<<query(1, 1, dr)<<"\n";
}
}
return 0;
}