#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int N,M;
int v[100000], rmq[322222];
void build(int l = 0, int r = N - 1, int pos = 0){
if(l == r){
rmq[pos] = v[l];
}
else{
int mid = (l + r)/2;
build(l, mid, 2*pos + 1);
build(mid + 1, r, 2*pos + 2);
rmq[pos] = max(rmq[2*pos+1], rmq[2*pos+2]);
}
}
int RMQ(int l, int r, int cl = 0, int cr = N - 1, int pos = 0){
if (cl > l || cr < r)
return 0;
if (l <= cl && r >= cr)
return rmq[pos];
int mid = cl + (cr - cl) / 2;
if (l > mid)
return RMQ(l,r,mid+1,r,2*pos+2);
else if (r <= mid)
return RMQ(l,r,l,mid,2*pos+1);
int lq= RMQ(l,r,l,mid,2*pos+1);
int rq = RMQ(l,r,mid+1,r,2*pos+2);
return max(lq, rq);
}
void update(int pos, int newvalue, int l = 0, int r = N - 1, int cpos = 0)
{
if(l == r)
{
rmq[cpos] = newvalue;
}
else{
int mid = (l + r)/2;
if(pos <= mid)
update(pos, newvalue, l, mid, cpos*2 + 1);
else
update(pos, newvalue, mid + 1, r, cpos*2 + 2);
rmq[cpos] = max(rmq[cpos*2 + 1], rmq[cpos*2+1]);
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> N >> M;
int i;
for(i = 0; i < N; i++)
f >> v[i];
for(int i = 0; i < 15; i ++)
cout << rmq[i] << " ";
build();
int x, y, type;
for (i = 0; i < M; i++){
f >> type >> x >> y;
if(type == 1)
update(x-1,y);
if(type == 0)
g << RMQ(x-1,y-1) << "\n";
}
cout<<"\n";
for(int i = 0; i < 15; i ++)
cout << rmq[i] << " ";
return 0;
}