#include<stdio.h>
#define HMAX 1 << 18
#define max(a,b) (a > b ? a : b)
int tree[HMAX];
void Upgrade(int node, int first, int second, int pos, int value)
{
int med;
if(first == second)
{
tree[node] = value;
return ;
}
med = (first + second) >> 1;
if(pos <= med)
Upgrade(node << 1, first, med, pos, value);
else
Upgrade((node << 1) + 1, med + 1, second, pos, value);
tree[node] = max(tree[node << 1], tree[(node << 1) + 1]);
}
int Query(int node, int first, int second, int st, int dr)
{
int med, aux1 = 0, aux2 = 0;
if(st <= first && second <= dr)
return tree[node];
med = (first + second) >> 1;
if(st <= med)
aux1 = Query(node << 1, first, med, st, dr);
if(med < dr)
aux2 = Query((node << 1) + 1, med + 1, second, st, dr);
return max(aux1, aux2);
}
int main()
{
int N, M, x, i, tip, y;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &N, &M);
for(i = 1; i <= N; i ++)
{
scanf("%d", &x);
Upgrade(1, 1, N, i, x);
}
while(M --)
{
scanf("%d%d%d", &tip, &x, &y);
if(tip == 0)
printf("%d\n", Query(1, 1, N, x, y));
if(tip == 1)
Upgrade(1, 1, N, x, y);
}
return 0;
}