#include <bits/stdc++.h>
#define NMAX 400000
using namespace std;
int Arbore[NMAX], i, j, N, x, y, M, nr, z;
void UpdateElem(int a, int b, int nod, int poz, int val)
{
if (a==b)
{
Arbore[nod]=val;
}
else
{
int middle=(a+b)/2;
if (poz<=middle)
UpdateElem(a, middle, nod*2, poz, val);
else
UpdateElem(middle+1, b, nod*2 + 1, poz, val);
Arbore[nod] = max(Arbore[2*nod], Arbore[2*nod + 1]);
}
}
int Query(int a, int b, int nod, int left, int right)
{
int r1=0, r2=0;
if (left<=a && right>=b)
return Arbore[nod];
int middle=(a + b)/2;
if (left<=middle)
r1 = Query(a, middle, 2*nod, left, right);
if (middle<right)
r2 = Query(middle+1, b, 2*nod+1, left, right);
return max(r1, r2);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d\n", &N, &M);
for (i=1; i<=N; i++)
{
scanf("%d", &x);
UpdateElem(1, N, 1, i, x);
}
for (i=1; i<=M; i++)
{
scanf("%d %d %d", &x, &y, &z);
if (x==1)
UpdateElem(1, N, 1, y, z);
else
printf("%d\n",Query(1, N, 1, y, z));
}
fclose(stdin); fclose(stdout);
return 0;
}