#include <bits/stdc++.h>
using namespace std;
ifstream f;
ofstream g;
int N,M;
int Arbint[4*100001];
char ibuf[1<<17], obuf[1<<17];
void Update(int node,int left,int right,int pos,int val)
{
if(left==right)
{
Arbint[node]=val;
return;
}
int middle=(left+right)/2;
if(middle>=pos) Update(2*node,left,middle,pos,val);
else Update(2*node+1,middle+1,right,pos,val);
Arbint[node]=max(Arbint[2*node],Arbint[2*node+1]);
}
int Query(int node, int left, int right, int x, int y)
{
if(x <= left && right <= y)
return Arbint[node];
int middle=(left+right)/2;
int maxi=-INT_MAX;
if(x <= middle) maxi=max(maxi,Query(2*node,left,middle,x,y));
if(y > middle) maxi=max(maxi,Query(2*node+1,middle+1,right,x,y));
return maxi;
}
int main()
{
f.rdbuf()->pubsetbuf(ibuf, 1<<17);
g.rdbuf()->pubsetbuf(obuf, 1<<17);
f.open("arbint.in");
g.open("arbint.out");
f>>N>>M;
for(int i=1; i<=N; i++)
{
int x;
f>>x;
Update(1,1,N,i,x);
}
for(int i=1; i<=M; i++)
{
int type,x,y;
f>>type>>x>>y;
if(type==0) g<<Query(1,1,N,x,y)<<'\n';
else Update(1,1,N,x,y);
}
}