#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, v[262145], maxim;
int max(int a, int b)
{
if(a>b)
return a;
return b;
}
void adaugare(int k, int st, int dr, int poz, int val)
{
if (st == dr)
{
v[k] = val;
return;
}
int m = (st+dr)/2, fs = k*2;
if (poz <= m)
adaugare(fs, st, m, poz, val);
else
adaugare(fs+1, m+1, dr, poz, val);
v[k] = max(v[fs], v[fs+1]);
}
void cautare(int k, int st, int dr, int inc, int sf)
{
if (inc <= st && dr <= sf)
{
if (maxim < v[k])
maxim = v[k];
return;
}
int m = (st+dr)/2, fs = k*2;
if (inc <= m)
cautare(fs, st, m, inc, sf);
if (m < sf)
cautare(fs+1, m+1, dr, inc, sf);
}
int main()
{
int a, b, c, i;
f>>n>>m;
for (i=1;i<=n;++i)
{
f>>c;
adaugare(1, 1, n, i, c);
}
for (i=1;i<=m;++i)
{
f>>c>>a>>b;
if (c)
adaugare(1, 1, n, a, b);
else
{
maxim = 0;
cautare(1, 1, n, a, b);
g<<maxim<<"\n";
}
}
return 0;
}