#include <stdio.h>
#define MAXN 100000
using namespace std;
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
int N, M, MAX;
int v[MAXN + 1], arb[4 * MAXN];
int max(int a , int b)
{
return a > b ? a : b;
}
void BUILD(int node, int left, int right)
{
if(right == left){
arb[node] = v[left];
return;
}
int mid = (left + right)/2;
BUILD(node * 2, left, mid);
BUILD(node * 2 + 1, mid + 1, right);
arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}
void UPDATE(int node, int left, int right, int pos, int val)
{
if(left == right)
{
arb[node] = val;
return;
}
int mid = (left + right)/2;
if(pos <= mid)
UPDATE(node * 2, left, mid, pos, val);
else
UPDATE(node * 2 + 1, mid + 1, right, pos, val);
arb[node] = max(arb[node * 2], arb[node *2 +1]);
}
void QUERY(int node, int left, int right, int a, int b)
{
if(a <= left && right <= b)
{
MAX = max(MAX , arb[node]);
return;
}
int mid = (left + right)/2;
if(a <= mid)
QUERY(node * 2, left, mid, a, b);
if(mid < b)
QUERY(node * 2 + 1, mid+1, right, a, b);
}
int main()
{
int i, type, a, b;
fscanf(fin, "%d %d", &N, &M);
for(i=1; i<=N; i++)
{
fscanf(fin, "%d", &v[i]);
}
BUILD(1, 1, N);
for(i=1; i<=M; i++)
{
fscanf(fin, "%d %d %d", &type, &a, &b);
if(type == 0){
MAX = 0;
QUERY(1, 1, N, a, b);
fprintf(fout, "%d\n", MAX);
}
else{
UPDATE(1, 1, N, a, b);
}
}
return 0;
}