#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, arbi[4*100001], nr, cod, a, b, max1;
void update(int node, int st, int dr, int poz, int val)
{
int med;
if (st==dr)
{
arbi[node]=val;
return;
}
med=(st+dr)/2;
if (poz<=med)
update(node*2, st, med, poz, val);
else
update(node*2+1, med+1, dr, poz, val);
arbi[node]=max(arbi[node*2], arbi[node*2+1]);
//arbi[node]=arbi[node*2]+arbi[node*2+1];
}
// se poate si cu int ca la pb. datorii mot
void query(int node, int st, int dr, int poz, int val)
{
int med=(st+dr)/2;
if (st>=a && dr<=b)
{
if (max1 < arbi[node]) max1=arbi[node];
return;
//return(arbi[node]);
}
//if (med>=a) max1=query(node*2, st, med, a, b);
//if (med<b) max2=query(node*2+1, med+1, dr, a, b);
//return max(max1, max2);
if (a<=med) query(node*2, st, med, a, b);
if (med<b) query(node*2+1, med+1, dr, a, b);
}
int main()
{
int i, j;
f>>n>>m;
for (i=1; i<=n; i++)
{
f>>nr;
update(1, 1, n, i, nr);
}
for (i=1; i<=m; i++)
{
f>>cod>>a>>b;
if (cod==1) update(1, 1, n, a, b);
else
{
//cout<<query(1, 1, n, a, b)<<"\n";
max1=-1;
query(1, 1, n, a, b);
g<<max1<<"\n";
}
}
return 0;
}