#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
vector <int> values(100001);
vector <int> nodes(400100);
void construct(int pos, int left, int right)
{
if(left == right)
{
nodes[pos] = values[left];
return;
}
construct(pos*2, left, (left + right)/2);
construct(pos*2+1, (left + right)/2+1, right);
nodes[pos] = max(nodes[pos*2], nodes[2*pos+1]);
}
int max_value(int pos, int left, int right, int start, int finish)
{
if(finish < left || right < start) return 0;
if(start <= left && right <= finish)
return nodes[pos];
int first_half = max_value(pos*2, left, (left+right)/2, start, finish);
int second_half = max_value(pos*2+1, (left+right)/2+1, right, start, finish);
return max(first_half, second_half);
}
void update(int curr, int left, int right, int val, int pos)
{
if(left == right)
{
nodes[curr] = val;
return;
}
if((left+right)/2 >= pos)
update(curr*2, left, (left+right)/2, val, pos);
else
update(curr*2+1, (left+right)/2+1, right, val, pos);
nodes[curr] = max(nodes[2*curr], nodes[2*curr+1]);
}
int main()
{
int n, m;
fin>>n>>m;
for(int i = 1; i <= n; i++)
fin>>values[i];
construct(1, 1, n);
for(int i = 0; i < m; i++)
{
int op, a, b;
fin>>op>>a>>b;
if(op == 0) ///0 a b - Sa se determine maximul din intervalul [a,b] (maximul dintre valorile Ai cu a ≤ i ≤ b).
fout<<max_value(1, 1, n, a, b)<<'\n';
else if(op == 1) ///1 a b - Valoarea elementului de pe pozitia a va deveni b
update(1,1, n, b, a);
}
return 0;
}