#include <stdio.h>
#define maxn 100005
int maximul[maxn*2+10];
int max,poz,val,c1,c2;
void react(int nod,int li, int ls){
if(li==ls){
maximul[nod]=val;
return;
}
int mij=li+(ls-li)/2;
//o iau prin stanga
if(poz<=mij)react(2*nod,li,mij);
else react(2*nod+1,mij+1,ls);//prin dreapta
//reactualizez tot ce e mai sus de locul unde am introdu noua valoare
//e maximul dintre cele doua intervale
if(maximul[2*nod]>maximul[2*nod+1])maximul[nod]=maximul[2*nod];
else maximul[nod]=maximul[2*nod+1];
}
void afla_maximul(int nod,int li, int ls){
//daca intervalul li, ls e inclus in cel cautat, atunci incerc sa reactualizez maximul
if(c1<=li && ls<=c2){
if(maximul[nod]>max)max=maximul[nod];
return;
}
//daca intervalul care ma intereseaza nu e inclus, inseamna ca e intersectie
int mij=li+(ls-li)/2;
if(c1<=mij)afla_maximul(2*nod,li,mij);
if(c2>mij)afla_maximul(2*nod+1,mij+1,ls);
}
int main(){
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
int i;
int cod, a,b,m,n;
fscanf(fin,"%d%d",&n,&m);
//citesc vectorul
for(i=1;i<=n;i++){
poz=i;
fscanf(fin,"%d",&val);
react(1,1,n);//sunt in nodul 1 (adica intervalul 1,n), pe total vreau sa bag valoare a pe pozitia poz
//vreau sa fac asta pastrand vectorul maximul actualizat
}
for(i=0;i<m;i++){
fscanf(fin,"%d%d%d",&cod,&a,&b);
if(cod==0){//deci afisare de maxim
max=-1;//toate val sunt pozitive, e ok sa init cu -1
//trebuie sa aflu unde in vector se afla intervalul a,b
c1=a;
c2=b;
afla_maximul(1,1,n);
fprintf(fout,"%d ",max);//sunt pe locul 1, si intervalul este 1,n
}else{//schimb valoare unui element
poz=a;
val=b;
react(1,1,n);
}
}
return 0;
}