#include <bits/stdc++.h>
#define N 100007
#define M 271071
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,q;
vector<int>a;
vector<int>arbore_intervale( N,-1 );
inline int Generare(int st,int dr,int poz)
{
if( st==dr )
{
return arbore_intervale[poz]=a[st];
}
int mij=(st+dr)/2;
return arbore_intervale[poz]=max(
Generare( st,mij,2*poz+1 ),
Generare( mij+1,dr,2*poz+2 )
);
}
int Maxim(int st,int dr,int poz,int x,int y)
{
/// st dr intervalull | x,y intrevarea | poz- coresp c=lui st dr
int mij=(st+dr)/2;
if( x<=st and dr<=y )return arbore_intervale[poz];
if( dr<x or y<st )return -1;
else
{
return max(
Maxim(st,mij,2*poz+1,x,y),
Maxim(mij+1,dr,2*poz+2,x,y)
);
}
}
int Update( int st,int dr,int poz,int index,int val )
{
int mij=(st+dr)/2;
if( st<=index and index<=dr )
{
if( st==dr )
{
arbore_intervale[poz]=val;
a[index]=val;
return val;
}
arbore_intervale[poz]=max(
Update(st,mij,2*poz+1,index,val),
Update(mij+1,dr,2*poz+2,index,val)
);
}
return arbore_intervale[poz];
}
void Citire()
{
fin >> n >> q;
a.resize(n+1);
for(int i=1;i<=n;i++)
fin >> a[i];
Generare(1,n,0);
// for(int i=0;i<= 20 ;i++)
// cout << i <<" " << arbore_intervale[i] << "\n";
for(int i=1;i<=q;i++)
{
int x,y,op;
fin >> op >> x >> y;
if( op )
{
/// a[x]=y;
Update( 1,n,0,x,y );
}
else
{
// cout << 1;
/// max din [x,y]
fout << Maxim(1,n,0,x,y) << '\n';
}
}
}
int main()
{
Citire();
return 0;
}