#include <cstdio>
#include <algorithm>
#define N 100005
using namespace std;
int n,m,x,y,vec[N];
class arb
{
private:
int a[N * 4],sol;
public:
arb();
void set_sol();
int get_sol();
void creare(int st, int dr, int poz);
void cautare(int st, int dr, int poz);
void update(int st, int dr, int poz);
};
arb::arb()
{
sol = 0;
}
void arb::set_sol()
{
sol = 0;
}
int arb::get_sol()
{
return sol;
}
void arb::creare(int st, int dr, int poz)
{
if(st == dr)
{
a[poz] = vec[st];
return;
}
int mij = (st + dr) >> 1;
creare(st, mij, poz * 2);
creare(mij + 1, dr, poz * 2 + 1);
a[poz] = max(a[poz * 2], a[poz * 2 + 1]);
}
void arb::cautare(int st, int dr, int poz)
{
if(st <= x && dr <= y)
{
sol = max(sol , a[poz]);
return;
}
int mij = (st + dr) >> 1;
if(mij >= x)
{
cautare(st, mij, poz * 2);
}
if(mij < y)
{
cautare(mij + 1, dr, poz * 2 + 1);
}
}
void arb::update(int st, int dr, int poz)
{
if(st == x)
{
a[poz] = y;
return;
}
int mij = (st + dr) >> 1;
if(x <= mij)
{
update(st, mij, poz * 2);
}
else
{
update(mij + 1, dr, poz * 2 + 1);
}
a[poz] = max(a[poz * 2], a[poz * 2 + 1]);
}
void citire()
{
arb arbore;
scanf("%d %d\n",&n,&m);
for(int i = 1 ; i <= n ; ++i)
{
scanf("%d ",&vec[i]);
}
scanf("\n");
arbore.creare(1,n,1);
int tmp;
for(int i = 1 ; i <= m ; ++i)
{
scanf("%d %d %d\n",&tmp,&x,&y);
if(!tmp)
{
arbore.set_sol();
arbore.cautare(1,n,1);
printf("%d\n",arbore.get_sol());
}
else
{
arbore.update(1,n,1);
}
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
return 0;
}