#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[1000001];
void update(int n, int st, int dr, int poz, int x)
{
if(st == dr)
{
arb[n] = x;
return;
}
int mij = (st + dr)/2;
if(poz <= mij) update(2*n, st, mij, poz, x);
else update(2*n + 1, mij + 1, dr, poz, x);
arb[n] = max(arb[2*n], arb[2*n + 1]);
}
int query(int n, int st, int dr, int a, int b)
{
int x = 0, y = 0;
if(a <= st && dr <= b)
return arb[n];
int mij = (st + dr) / 2;
if(a <= mij)
x = query(2*n, st, mij, a , b);
if(b > mij)
y = query(2*n + 1, mij + 1, dr, a, b);
return max(x, y);
}
int main()
{
int n, m, x, a, b, op, i;
in>>n>>m;
for(i = 0; i < n; i++)
{
in>>x;
update(1, 1, n, i + 1, x);
}
for(i = 0; i < m; i++)
{
in>>op>>a>>b;
if(op == 0)
out<<query(1, 1, n, a, b)<<"\n";
else
update(1, 1, n, a, b);
}
return 0;
}