#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int m;
class ArboreDeIntervale{
private:
int n;
int sirCitit[100005];
int sir[400005];
int val;
void construire(int x, int st, int dr)
{
if(st == dr)
{
sir[x] = sirCitit[st];
return;
}
int m = (st + dr) / 2;
construire(2 * x, st, m);
construire(2 * x + 1, m + 1, dr);
sir[x] = max(sir[2 * x], sir[2 * x + 1]);
}
void querry(int x, int st, int dr, int a, int b)
{
if(st >= a && dr <= b)
{
val = max(val, sir[x]);
return;
}
int m = (st + dr) / 2;
if(a <= m)
{
querry(x * 2, st, m, a, b);
}
if(b > m)
{
querry(x * 2 + 1, m + 1, dr, a, b);
}
}
public:
void construireArbore(int sirx[], int _n)
{
n = _n;
for(int i = 1; i <= n; i++)
{
sirCitit[i] = sirx[i];
}
construire(1, 1, n);
}
int cautare(int st, int dr)
{
val = 0;
querry(1, 1, n, st, dr);
return val;
}
void update(int x, int nodCautat, int st, int dr, int valoare)
{
if(st == dr)
{
sir[x] = valoare;
return;
}
int m = (st + dr) / 2;
if(nodCautat <= m)
{
update(x * 2, nodCautat, st, m, valoare);
}
else
{
update(x * 2 + 1, nodCautat, m + 1, dr, valoare);
}
sir[x] = max(sir[2 * x], sir[2 * x + 1]);
}
}arbore;
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n;
int sirxx[100005];
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%d", &sirxx[i]);
}
arbore.construireArbore(sirxx, n);
for(int i = 0; i < m; i++)
{
int tmp1, tmp2, tmp3;
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
if(tmp1 == 0)
{
printf("%d\n", arbore.cautare(tmp2, tmp3));
}
else if(tmp1 == 1)
{
arbore.update(1, tmp2, 1, n, tmp3);
}
}
return 0;
}