#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX = 100000+5;
const int LMAX = 131072+5;
void Read(),Solve();
int N,M,Lim;
int AI[2*LMAX];
int V[NMAX];
void Build(int nod,int left,int right)
{
if(left == right)
{
AI[nod] = V[left];
return;
}
int middle = (left + right)/2;
Build(2*nod,left,middle);
Build(2*nod+1,middle+1,right);
AI[nod] = max(AI[2*nod], AI[2*nod+1]);
}
int Query(int nod,int left,int right,int low,int high)
{
if(high < left || right < low) return 0;
if(low <= left && right <= high) return AI[nod];
int middle = (left + right)/2;
int qleft = Query(2*nod,left,middle,low,high);
int qright = Query(2*nod+1,middle+1,right,low,high);
return max(qleft,qright);
}
void Update(int nod,int left,int right,int position,int value)
{
if(left == right)
{
AI[nod] = value;
return;
}
int middle = (left + right)/2;
if(position <= middle) Update(2*nod,left,middle,position,value);
else Update(2*nod+1,middle+1,right,position,value);
AI[nod] = max(AI[2*nod], AI[2*nod+1]);
}
int main()
{
Read();
Solve();
return 0;
}
void Read()
{
int i;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for(i = 1; i <= N; i++)
scanf("%d",&V[i]);
}
void Solve()
{
int t,a,b;
for(Lim = 1; Lim < N; Lim <<= 1);
Build(1,1,Lim);
for(; M; --M)
{
scanf("%d%d%d",&t,&a,&b);
if(t==0) printf("%d\n",Query(1,1,Lim,a,b));
else Update(1,1,Lim,a,b);
}
}