#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
using namespace std;
void crearea_arbore(int* arboric, vector<int> &v, int stanga, int dreapta, int poz){
if(stanga == dreapta){
arboric[poz]=v[stanga];
}
else{
crearea_arbore(arboric, v, stanga, (stanga+dreapta)/2,2*poz); // 2*poz = fiul stang
crearea_arbore(arboric, v, (stanga+dreapta)/2+1, dreapta,2*poz+1); // 2*poz+1 = fiul drept
arboric[poz]=max(arboric[2*poz],arboric[2*poz+1]);
// 1
// 2 3
// 4 5 6 7
// Acesta e arborele de indici ale arborelui binar
}
}
void maximul_a_b(int* arboric, vector<int> &v, int stanga, int dreapta, int poz, int stanga_curent, int dreapta_curent, int& maxim){
if (stanga<=stanga_curent && dreapta>=dreapta_curent){
maxim= max(maxim, arboric[poz]);
}
else{
int mij=(stanga_curent+dreapta_curent)/2;
if (mij>=stanga)
maximul_a_b(arboric, v, stanga, dreapta, poz*2, stanga_curent, mij, maxim);
if (mij<dreapta)
maximul_a_b(arboric, v, stanga, dreapta, poz*2+1, mij+1, dreapta_curent, maxim);
}
}
void schimbare_element(int* arboric, vector<int> &v, int stanga, int dreapta, int poz_curent, int de_actualizat, int poz_actualizare){
if (stanga == dreapta){
v[poz_actualizare]= de_actualizat;
arboric[poz_curent]= de_actualizat;
}
else{
int mij=(stanga+dreapta)/2;
if (mij>=poz_actualizare){
schimbare_element(arboric,v,stanga,mij,poz_curent*2, de_actualizat, poz_actualizare);
arboric[poz_curent]=max(arboric[poz_curent*2],arboric[poz_curent*2+1]);
}
else{
schimbare_element(arboric,v,mij+1,dreapta,poz_curent*2+1, de_actualizat, poz_actualizare);
arboric[poz_curent]=max(arboric[poz_curent*2],arboric[poz_curent*2+1]);
}
}
}
int main() {
ifstream f("arbint.in");
int n,m,aux;
f>>n>>m;
vector<int> numere;
for(int i=0; i<n;i++) {
f >> aux;
numere.push_back(aux);
}
int arbore[1<<(int)(log2(n)+2)];
arbore[0]=-1;
crearea_arbore( arbore, numere, 0, n-1 , 1);
for(int a=0; a<1<<(int)(log2(n)+2);a++)
cout<<arbore[a]<<' ';
cout<<endl;
ofstream g("arbint.out");
int comanda, a,b;
for(int i=0;i<m;i++){
f>>comanda>>a>>b;
if (comanda==0){
a--;
b--;
int maxim = 0;
maximul_a_b(arbore, numere, a, b,1, 0 , n-1, maxim);
g<<maxim<<'\n';
}
else{
a--;
schimbare_element(arbore, numere,0, n-1, 1, b, a);
}
}
f.close();
g.close();
return 0;
}