#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN =100100;
int n,m;
/*
nodStart (1, n) - 1
2 - (1, n/2), 3 - (n/ 2 + 1, n)
4 -(1, n/4), 5 - (n/4 + 1, n/2), 6 - (n/2 + 1, ) 7
8
nod - nr
nodFiu Stanga = nr *2
nodFiu Dreapta = nr * 2 + 1*/
class aint {
public:
aint() {
fill(v + 1, v + 3 * n + 1, 0);
}
int update_public(int poz, int x) {
update(1, 1, n, poz, x);
}
int query_public(int left, int right) {
return query(1, 1, n, left, right);
}
private:
int v[4 * MAXN];
void update (int nod, int st, int dr, int poz, int x)
{
if (st == dr)
{
v[nod] = x;
return;
}
int m = (st + dr) / 2;
int nodStanga = nod * 2;
int nodDreapta = nod * 2 + 1;
if (poz <= m)
update (nodStanga, st, m, poz, x);
else
update (nodDreapta, m + 1, dr, poz, x);
v[nod] = max(v[nodStanga], v[nodDreapta]);
}
int query (int nod, int st, int dr, int left, int right)
{
if (left <= st && dr <= right)
return v[nod];
int m = (st + dr) / 2;
int nodStanga = nod * 2;
int nodDreapta = nod * 2 + 1;
int rez = -1;
if (left <= m)
rez = max(rez, query(nodStanga, st, m, left, right));
if (right > m)
rez = max(rez, query(nodDreapta, m + 1, dr, left, right));
return rez;
}
};
aint a;
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++){
int x; fin>>x;
a.update_public(i,x);
}
for(int i=1;i<=m;i++){
int tip,x,y;
fin>>tip>>x>>y;
if(tip)
a.update_public(x,y);
else
fout<<a.query_public(x,y)<<"\n";
}
}