#include<cstdio>
using namespace std;
int aint[260005], p = 1;
inline int max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
int query(int ind, int st, int dr, int cst, int cdr)
{
int med;
if(cst == st && cdr == dr)
return aint[ind];
else
{
med = (st + dr) >> 1;
if(cst <= med && cdr > med)
return max(query(ind + ind, st, med, cst, med), query(ind + ind + 1, med + 1, dr, med + 1, cdr));
else
{
if(cst <= med)
return query(ind + ind, st, med, cst, cdr);
else
return query(ind + ind + 1, med + 1, dr, cst, cdr);
}
}
}
void update(int poz, int val)
{
int cpoz;
cpoz = poz + p - 1;
aint[poz + p - 1] = val;
cpoz = cpoz/2;
while(cpoz)
{
aint[cpoz] = max(aint[cpoz + cpoz], aint[cpoz + cpoz + 1]);
cpoz = cpoz/2;
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, i, a, b, c;
scanf("%d%d", &n, &m);
while(p < n)
{
p += p;
}
for(i = 1; i <= n; ++ i)
scanf("%d", &aint[p + i - 1]);
for(i = p - 1; i >= 1; -- i)
aint[i] = max(aint[i + i], aint[i + i + 1]);
for(i = 1; i <= m; ++ i)
{
scanf("%d%d%d", &a, &b, &c);
if(a == 0)
printf("%d\n",query(1, 1, p, b, c));
else
update(b, c);
}
return 0;
}