#include <fstream>
using namespace std;
ifstream fin ("date.in" );
ofstream fout("date.out");
int N, M, i, j, K, ok, k, pos, Q;
int V[DIM], Arb[DIM];
void SetUp(){
fin >> N >> Q;
for(i = 1; i <= N; i ++)
fin >> V[i];
return;
}
int MAX(int a, int b){
if(a >= b) return a;
if(a <= b) return b;
}
void Shift(int c){
int p = c / 2;
while(p != 0){
if(Arb[p] < Arb[c]){
Arb[p] = Arb[c];
c = p;
p /= 2;
}
else
break;
}
return;
}
void BuildArb(int st, int dr, int pos){
if(st == dr){
Arb[pos] = V[st];
}
else{
int mid = st + (dr - st) / 2;
BuildArb(st, mid, pos*2);
BuildArb(mid+1, dr, pos*2+1);
Arb[pos] = MAX(Arb[pos*2], Arb[pos*2+1]);
}
return;
}
void Find(int st, int dr, int pos){
if(st == dr){
Arb[pos] = b;
Shift(pos);
}
else{
int mid = st + (dr - st) / 2;
if(a <= mid)
Find(st, mid, pos*2);
else
Find(mid+1, dr, pos*2+1);
}
return;
}
void GetMax(int st, int dr, int pos){
if(st == dr){
if(maxim < Arb[pos])
maxim = Arb[pos];
}
else{
if(a >= st && b <= mid)
Arb(st, mid, pos*2)
}
return;
}
void Cerinta_1(){
maxim = 0;
GetMax(1, N, 1);
return;
}
void Cerinta_2(){
Find(1, N, 1);
return;
}
void CodeExpert(){
for(k = 1; k <= Q; k ++){
fin >> cod >> a >> b;
switch(cod)
{
case 0:{Cerinta_1(); break;}
case 1:{Cerinta_2(); break;}
}
}
return;
}
int main(){
SetUp();
BuildArb(1, N, 1);
CodeExpert();
return 0;
}