#include <bits/stdc++.h>
using namespace std;
int n,q;
int v[100005];
struct nod
{
int val;
nod *st, *dr;
nod(int a, int b)
{
val = 0;
if(a==b)
{
return;
}
int mij = (a + b) >> 1;
st = new nod(a,mij);
dr = new nod(mij + 1,b);
}
void update(int poz, int valoare, int a, int b)
{
if(a==b)
{
val = valoare;
return;
}
int mij = (a + b) >> 1;
if(poz<=mij)
{
st -> update(poz,valoare,a,mij);
}
else
{
dr -> update(poz,valoare,mij+1,b);
}
val = max(st->val,dr->val);
}
int query(int qa, int qb, int a, int b)
{
if(qa<=a && qb>=b)
{
return val;
}
int mij = (a + b) >> 1;
int rez = 0;
if(qa<=mij && qb>mij)
{
return max(st->query(qa,qb,a,mij),dr->query(qa,qb,mij+1,b));
}
if(qa<=mij)
{
return st -> query(qa,qb,a,mij);
}
if(qb>mij)
{
return dr -> query(qa,qb,mij+1,b);
}
}
};
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
cin>>n>>q;
nod t(1,n);
for(int i=1;i<=n;i++)
{
cin>>v[i];
t.update(i,v[i],1,n);
}
for(int i=1;i<=q;i++)
{
int tip;
cin>>tip;
if(tip==1)
{
int poz, val;
cin>>poz>>val;
t.update(poz,val,1,n);
}
else
{
int st,dr;
cin>>st>>dr;
cout<<t.query(st,dr,1,n)<<'\n';
}
}
return 0;
}