#include <iostream>
#include <fstream>
const int N=1000004;
using namespace std;
int v[1000001], a[1000001], maxi;
int maximum(int x, int y)
{
if(x >= y)
return x;
return y;
}
void constructie( int s, int d, int nr)
{
if(s == d)
v[nr] = a[d];
else
{
int mijl = (s + d) / 2;
constructie(s, mijl, nr*2);
constructie(mijl+1, d, nr*2+1);
v[nr] = maximum(v[2*nr], v[2*nr + 1]);
}
}
void operatie0(int nr, int s, int d, int pozitie)
{
if(s==d)
{
v[nr]=a[s];
return;
}
else
{
int mijl = (s + d) / 2;
if(pozitie <= mijl)
operatie0(nr * 2, s, mijl, pozitie);
else
operatie0(nr * 2 +1, mijl+ 1, d, pozitie);
v[nr] = maximum(v[nr * 2], v[nr * 2 + 1]);
}
}
void operatie1(int nr, int s, int d, int x, int y)
{
if(x<=s && y>=d)
{
if(maxi<v[nr])
maxi=v[nr];
}
else
{
int mijl=(s+d)/2;
if(x<=mijl)
operatie1(nr*2,s,mijl,x,y);
if(y>mijl)
operatie1(nr*2+1,mijl+1,d,x,y);
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, op, m1, m2;
f>>n>>m;
for(int i=1; i<=n; i++)
f>>a[i];
constructie(1, n, 1);
for(int i=0; i<m; i++)
{
f>>op>>m1>>m2;
if(op == 0)
{
maxi = 0;
operatie1(1, 1, n, m1, m2);
g<<maxi<<'\n';
}
else
{
a[m1] = m2;
operatie0(1, 1, n, m1);
}
}
return 0;
}