#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
long int elem[100000], nr_elem, tree[400000];
long int i, j;
void init_tree(int ind, int st, int dr)
{
if (st == dr)
tree[ind] = elem[st];
else
{
int mid = (st + dr) / 2;
init_tree(ind * 2, st, mid);
init_tree(ind * 2 + 1, mid + 1, dr);
tree[ind] = max(tree[ind * 2], tree[ind * 2 + 1]);
}
}
void actualizare(int ind, int st, int dr, int poz, int val)
{
if (st == dr)
tree[ind] = val;
else
{
int middle = (st + dr) / 2;
if (poz >= middle + 1)
actualizare(ind * 2 + 1, middle + 1, dr, poz, val);
else
actualizare(ind * 2, st, middle, poz, val);
tree[ind] = max(tree[ind * 2], tree[ind * 2 + 1]);
}
}
int maxt(int ind, int st, int dr, int q_st, int q_dr)
{
if (st >= q_st && q_dr >= dr)
return tree[ind];
else
{
int middle = (st + dr) / 2;
if (q_st >= middle + 1)
return maxt(ind * 2 + 1, middle + 1, dr, q_st, q_dr);
else if (q_dr <= middle)
return maxt(ind * 2, st, middle, q_st, q_dr);
else
return max(maxt(ind * 2 + 1, middle + 1, dr, q_st, q_dr), maxt(ind * 2, st, middle, q_st, q_dr));
}
}
int main()
{
int task, nr_task, a, b;
fin >> nr_elem >> nr_task;
for (i = 1; i <= nr_elem; i++)
fin >> elem[i];
init_tree(1, 1, nr_elem);
for (i = 1; i <= nr_task; i++)
{
fin >> task;
fin >> a >> b;
if (task == 0)
fout << maxt(1, 1, nr_elem, a, b) << "\n";
else
actualizare(1, 1, nr_elem, a, b);
}
return 0;
}