#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax = 100010;
int n, q, a[4 * nmax],sol;
void build(int nod, int st, int dr)
{
if (st == dr)
fin >> a[nod];
else
{
int mid = (st + dr) / 2;
build(nod * 2 , st , mid);
build(nod * 2 + 1,mid + 1,dr);
a[nod] = max(a[nod * 2],a[nod * 2 + 1]);
}
}
void update(int nod,int st,int dr,int poz,int val)
{
if(st == dr)
a[nod] = val;
else
{
int mid = (st + dr) / 2;
if(poz <= mid)
update(nod * 2,st,mid,poz,val);
if(poz > mid)
update(nod * 2 + 1,mid + 1,dr,poz,val);
a[nod] = max(a[nod * 2],a[nod * 2 + 1]);
}
}
void query(int nod,int st,int dr,int poz_st,int poz_dr)
{
if(poz_st <= st && dr <= poz_dr)
sol = max(sol,a[nod]);
else
{
int mid = (st + dr) / 2;
if(poz_st <= mid)
query(2 * nod,st,mid,poz_st,poz_dr);
if(mid < poz_dr)
query(2 * nod + 1,mid + 1,dr,poz_st,poz_dr);
a[nod] = max(a[2 * nod],a[2 * nod + 1]);
}
}
int main()
{
fin>>n>>q;
build(1,1,n);
for(int i = 1;i <= q;i++)
{
int tip;
fin>>tip;
if(tip == 0)
{
int st,dr;
fin>>st>>dr;
///query
sol = INT_MIN;
query(1,1,n,st,dr);
fout<<sol<<"\n";
}
else
{
int poz,val;
fin>>poz>>val;
///update
update(1,1,n,poz,val);
}
}
}