#include <cstdio>
#define DIM 8192
#define N 100001
#define common \
int m=(l+r)>>1, L=n<<1, R=L+1
char ax[DIM];
int pz;
inline void cit(int &x)
{
x=0;
while(ax[pz]<'0' || ax[pz]>'9')
if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
while(ax[pz]>='0' && ax[pz]<='9')
{
x=x*10+ax[pz]-'0';
if(++pz==DIM)fread(ax, 1, DIM, stdin),pz=0;
}
}
inline void scrie(int x)
{
char lin[30], *s;
s=lin+29;s[0]=0;
int cat;
do
{
cat=x/10;
--s;
s[0]=x-cat*10+'0';
x=cat;
}while(x);
puts(s);
}
inline int max(int a, int b)
{
if(a<b) return b; return a;
}
int H[3*N], a[N], n,m;
inline void build(int n, int l, int r)
{
if(l==r) { H[n]=a[l]; return;}
common;
build(L, l, m); build(R, m+1, r);
H[n]=max(H[L], H[R]);
}
inline void update(int n, int l,int r, int p, int v)
{
if(l==r) { H[n]=v;return;}
common;
if(p <= m) update(L, l, m, p, v);
else update(R, m+1, r, p, v);
H[n]=max(H[L], H[R]);
}
inline int query(int n, int l, int r, int ql, int qr)
{
if(ql <= l && r <= qr) return H[n];
common;
int v=0;
if(ql <= m) v=max(v, query(L, l, m, ql, qr));
if(qr > m) v=max(v, query(R, m+1, r, ql, qr));
return v;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
cit(n);cit(m);
int i;
for(i=1;i<=n;++i) cit(a[i]);
build(1, 1, n);
int t, p, q;
while(m--)
{
cit(t);cit(p);cit(q);
if(t) update(1, 1, n, p, q);
else scrie(query(1, 1, n, p, q));
}
return 0;
}