#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MaxT 265000
#define MaxN 100001
#define MAX 131072
using namespace std;
int N,M,T[MaxT],pos,v[MaxN],Start,End,Type,Ans,P,Val;
char f[MAX];
int max2(int a,int b)
{
if (a>b) return a;
else return b;
}
void Read(int &nr)
{
nr=0;
while(f[pos]<'0'||f[pos]>'9')
{
pos++;
if(pos==MAX)
fread(f,1,MAX,stdin),pos=0;
}
while(f[pos]>='0'&&f[pos]<='9')
{
nr=10*nr+f[pos++]-'0';
if(pos==MAX)
fread(f,1,MAX,stdin),pos=0;
}
}
void DFS(int node,int start,int end)
{
if(start==end)
{
T[node]=v[start];
return;
}
DFS(node*2,start,(start+end)>>1);
DFS(node*2+1,((start+end)>>1)+1,end);
T[node]=max2(T[node*2],T[node*2+1]);
}
void Update(int node,int start,int end)
{
if(start==end)
{
T[node]=Val;
return;
}
int mid=(start+end)>>1;
if(P>mid)
Update(node*2+1,mid+1,end);
else Update(node*2,start,mid);
T[node]=max2(T[2*node],T[2*node+1]);
}
void Query(int node,int start,int end)
{
if(start>=Start&&end<=End)
Ans=max2(Ans,T[node]);
else
{
int mid=(start+end)>>1;
if (Start<=mid)
Query(node*2,start,mid);
if(End>mid) Query(node*2+1,mid+1,end);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
fread(f,1,MAX,stdin);
Read(N);
Read(M);
for(int i=1;i<=N;i++)
Read(v[i]);
DFS(1,1,N);
for(int i=1;i<=M;i++)
{
Read(Type);
if(!Type)
{
Read(Start),Read(End);
Ans=0;
Query(1,1,N);
printf("%d\n",Ans);
}
else
{
Read(P),Read(Val);
Update(1,1,N);
}
}
return 0;
}