#include <stdio.h>
#include <stdlib.h>
struct nod{
struct nod *left,*right;
int val,limleft,limright;
};
int max(int a,int b){
if(a>b)
return a;
return b;
}
struct nod *newNod(){
struct nod *aux=NULL;
if((aux=(struct nod*)malloc(sizeof(struct nod)))==NULL){
printf("Memorie insuficeinta\n");
exit(1);
}
return aux;
}
struct nod *createNod(int v[],int start,int stop){
struct nod *ret;
ret=newNod();
if(start==stop){
ret->limleft=start;
ret->limright=stop;
ret->left=NULL;
ret->right=NULL;
ret->val=v[start];
return ret;
}
int mid=start+(stop-start)/2;
ret->limleft=start;
ret->limright=stop;
ret->left=createNod(v,start,mid);
ret->right=createNod(v,mid+1,stop);
ret->val=max(ret->left->val,ret->right->val);
return ret;
}
void freeArb(struct nod *arbint){
if(arbint->limleft==arbint->limright)
free(arbint);
else{
freeArb(arbint->left);
freeArb(arbint->right);
free(arbint);
}
}
int cautare(struct nod *arbint,int a,int b){
if(arbint->limleft==a && arbint->limright==b)
return arbint->val;
int mid=arbint->limleft+(arbint->limright-arbint->limleft)/2;
if(a<=mid && b<=mid)
return cautare(arbint->left,a,b);
if(a>mid && b>mid)
return cautare(arbint->right,a,b);
if(a<=mid && b>mid)
return max(cautare(arbint->left,a,mid),cautare(arbint->right,mid+1,b));
return -1;
}
void update(struct nod *arbint,int a,int b){
if(arbint->limleft==arbint->limright)
arbint->val=b;
else{
int mid=arbint->limleft+(arbint->limright-arbint->limleft)/2;
if(a<=mid)
update(arbint->left,a,b);
else
update(arbint->right,a,b);
arbint->val=max(arbint->left->val,arbint->right->val);
}
}
int main(){
int N,M,v[100000],a,b,k;
FILE *f, *g;
if((f=fopen("arbint.in","r"))==NULL){
printf("eroare deschidere fisier\n");
exit(1);
}
if((g=fopen("arbint.out","w"))==NULL){
printf("eroare deschidere fisier\n");
exit(1);
}
struct nod *arbint;
fscanf(f,"%d",&N);
fscanf(f,"%d",&M);
for(int i=0;i<N;i++){
fscanf(f,"%d",&v[i]);
}
arbint=createNod(v,0,N-1);
for(int i=0;i<M;i++){
fscanf(f,"%d",&k);
fscanf(f,"%d",&a);
a--;
fscanf(f,"%d",&b);
b--;
switch(k){
case 0:
fprintf(g,"%d\n",cautare(arbint,a,b));
break;
case 1:
b++;
v[a]=b;
update(arbint,a,b);
}
}
freeArb(arbint);
fclose(f);
fclose(g);
return 0;
}