#include<stdio.h>
#define MAX 100000
int maxim(int a,int b)
{
if(a>b)
return a;
return b;
}
void construire(int A[],int arbore[],int nod,int stg,int dr)
{
if(stg==dr)
{
arbore[nod]=A[stg];
return ;
}
int mijloc=(stg+dr)/2;
construire(A,arbore,2*nod,stg,mijloc);
construire(A,arbore,2*nod+1,mijloc+1,dr);
arbore[nod]=maxim(arbore[2*nod],arbore[2*nod+1]);
}
int interogare(int arbore[],int nod,int stg,int dr,int a, int b)
{
if(a<=stg && dr<=b)
return arbore[nod];
if(dr<a || b<stg)
return 0;
int mijl=(stg+dr)/2;
int rez_stg=interogare(arbore,2*nod,stg,mijl,a,b);
int rez_dr=interogare(arbore,2*nod+1,mijl+1,dr,a,b);
return maxim(rez_stg,rez_dr);
}
void actualizare(int arbore[],int nod,int stg,int dr,int poz,int val_noua)
{
if(stg==dr)
{
arbore[nod]=val_noua;
return;
}
int mijl=(stg+dr)/2;
if(poz<=mijl)
{
actualizare(arbore,2*nod,stg,mijl,poz,val_noua);
}
else{
actualizare(arbore,2*nod+1,mijl+1,dr,poz,val_noua);
}
arbore[nod]=maxim(arbore[2*nod],arbore[2*nod+1]);
}
int main()
{
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
int n,m;
int A[MAX+1];
static int arbore[4*MAX];
if(fscanf(fin,"%d %d",&n,&m)!=2)
{
printf("citire incorecta\n");
return 1;
}
for(int i=1;i<=n;i++)
{
if(fscanf(fin,"%u",&A[i])!=1)
{
printf("citire incorecta\n");
return 1;
}
}
construire(A,arbore,1,1,n);
for(int i=0;i<m;i++)
{
int tip,a,b;
if(fscanf(fin,"%d %d %u",&tip,&a,&b)!=3)
{
printf("citire incorecta\n");
return 1;
}
if(tip==0)
{
fprintf(fout,"%u\n",interogare(arbore,1,1,n,a,b));
}
else
{
actualizare(arbore,1,1,n,a,b);
}
}
fclose(fin);
fclose(fout);
return 0;
}