#include<iostream>
#include<fstream>
using namespace std;
long arb[100001],a,b,maxim,val,v[100001],n,maxpoz=0;
long max(long a, long b)
{
if (a<b) return b;
else return a;
}
void create(int poz, int st, int dr)
{
int mij;
if (st==dr) {arb[poz]=v[st]; if (poz>maxpoz) maxpoz=poz;}
else
{
mij=(st+dr)/2;
create(poz*2,st,mij);
create(poz*2+1,mij+1,dr);
arb[poz]=max(arb[poz*2],arb[poz*2+1]);
}
}
void update(int poz,int st,int dr, int a, int val)
{
if (st==dr) arb[poz]=val;
else
{
int mij=(st+dr)/2;
if (a<mij) update(poz*2,st,mij,a,val);
else update(poz*2+1,mij+1,dr,a,val);
}
//arb[poz]=max(arb[poz*2],arb[poz*2+1]);
arb[poz/2]=max(arb[poz],arb[poz+1]);
}
void verif(int poz,int st, int dr)
{
if (a<=st && b>=dr) {if (arb[poz]>maxim) maxim=arb[poz];}
else
{
int mij=(st+dr)/2;
if (a<=mij) verif(2*poz,st,mij);
if (b>mij) verif(2*poz+1,mij+1,dr);
}
}
int main()
{
int i,o,x,m;
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for (i=1; i<=n; i++)
f>>v[i];
create(1,1,n);
for (i=1; i<=m; i++)
{
f>>o>>a>>b;
if (o==0)
{
maxim=0;
verif(1,1,n);
g<<maxim<<endl;
}
else update(1,1,n,a,b);
}
//for (i=1; i<=maxpoz; i++) cout<<arb[i]<<" ";
return 0;
}