#include <fstream>
#include <math.h>
#define INF 2000000000
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int N,M;
int X[110000];
int lb; /// lungime bucket-uri
int nrb; /// numarul de bucket-uri
int Y[400];
/// X[poz]=val
void update(int poz,int val)
{
X[poz]=val;
int b;
b=(poz-1)/lb+1;
int st,dr;
st=(b-1)*lb+1;
dr=b*lb;
int rez;
rez=-INF;
for (int i=st;i<=dr;i++)
rez=max(rez,X[i]);
Y[b]=rez;
}
/// returneaza min(X[st]...X[dr])
int query(int st, int dr)
{
int bst,bdr;
bst=(st-1)/lb+1;
bdr=(dr-1)/lb+1;
if (bst==bdr)
{
int rez;
rez=-INF;
for (int i=st;i<=dr;i++)
rez=max(rez,X[i]);
return rez;
}
else
{
int rez;
rez=-INF;
for (int i=bst+1;i<=bdr-1;i++)
rez=max(rez,Y[i]);
int p;
p=bst*lb;
for (int i=st;i<=p;i++)
rez=max(rez,X[i]);
p=(bdr-1)*lb+1;
for (int i=p;i<=dr;i++)
rez=max(rez,X[i]);
return rez;
}
}
int main()
{
fi>>N>>M;
for (int i=1;i<=N;i++)
fi>>X[i];
lb=(int)sqrt((double)N);
int rest;
rest=N % lb;
if (rest==0)
nrb=N/lb;
else
nrb=N/lb+1;
int p;
p=N+1;
while (p<=lb*nrb)
{
X[p]=-INF;
p++;
}
for (int i=1;i<=nrb;i++)
Y[i]=-INF;
for (int i=1;i<=N;i++)
{
int b;
b=(i-1)/lb+1;
Y[b]=max(Y[b],X[i]);
}
for (int q=1;q<=M;q++)
{
int tip;
fi>>tip;
if (tip==0)
{
/// query
int st,dr;
fi>>st>>dr;
fo<<query(st,dr)<<"\n";
}
else
{
/// update
int poz,val;
fi>>poz>>val;
update(poz,val);
}
}
fi.close();
fo.close();
return 0;
}