#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int v[100001];
int n, m;
typedef struct tree
{
int max;
tree* left;
tree* right;
};
int maxim(int a, int b)
{
if (a > b)
return a;
else
return b;
}
void createTree(tree*& node,int l,int r)
{
if (l == r)
{
node->max = v[l];
node->left = NULL;
node->right = NULL;
return;
}
tree* left = (tree*)malloc(sizeof(tree));
tree* right = (tree*)malloc(sizeof(tree));
node->left = left;
node->right = right;
int div = (l + r) / 2;
createTree(node->left, l, div);
createTree(node->right, div + 1, r);
if(node->left!=NULL)
node->max = maxim(node->left->max, node->right->max);
}
int val,pos;
void update(tree*& node, int l, int r)
{
if (pos == l && pos == r)
{
node->max = val;
return;
}
int div = (l + r) / 2;
if (pos <= div)
update(node->left, l, div);
else
update(node->right, div + 1, r);
node->max = maxim(node->left->max, node->right->max);
}
int start, finish,max;
void query(tree* node, int l, int r)
{
if (l >= start && r <= finish)
{
if (max < node->max)
max = node->max;
return;
}
if (l == r)
return;
int div = (l + r) / 2;
if(start<=div)
query(node->left, l, div);
if (finish > div)
query(node->right, div + 1, r);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &v[i]);
}
tree* head = (tree*)malloc(sizeof(tree));
createTree(head, 1, n);
int x,a,b;
for (int i = 1; i <= m; i++)
{
scanf("%d%d%d", &x,&a,&b);
if (x)
{
val = b;
pos = a;
update(head, 1, n);
}
else
{
max = 0;
start = a;
finish = b;
query(head, 1, n);
printf("%d\n", max);
}
}
}