#include<stdio.h>
#include<stdlib.h>
typedef struct{
int st;
int dr;
}interval;
typedef struct nod{
interval I;
struct nod * st;
struct nod * dr;
}TNod,*Tarb;
Tarb buildNode(int i, int j)
{
Tarb aux = (Tarb )malloc(1 * sizeof(TNod));
aux->st = NULL;
aux->dr = NULL;
(aux->I).st = i;
(aux->I).dr = j;
return aux;
}
Tarb buildTree(int i, int j)
{
Tarb root = buildNode(i,j);
if(i == j)
return root;
int mij = (i+j)/2;
root->st= buildTree(i,mij);
root->dr= buildTree(mij+1,j);
return root;
}
int Imax(Tarb root,int a,int b,int * v)
{
if(a == b)
return v[a];
int i = (root->I).st;
int j = (root->I).dr;
int mij = (i+j)/2;
if(b <= mij)
return Imax(root->st,a,b,v);
if( a > mij)
return Imax(root->dr,a,b,v);
int max1 = Imax(root->st,a,mij,v);
int max2 = Imax(root->dr,mij+1,b,v);
return (max1 > max2) ? max1:max2;
}
int main(void)
{
FILE * fin = fopen("arbint.in","rt");
FILE * fout = fopen("arbint.out","wt");
int n,m,i;
fscanf(fin,"%d%d",&n,&m);
int *v = (int*) calloc(n+1, sizeof(int));
for(i = 1; i <= n ;i++)
fscanf(fin,"%d",v+i);
Tarb root = buildTree(1,n);
int op,a,b;
for(i = 0; i < m; i++)
{
fscanf(fin,"%d%d%d",&op,&a,&b);
if(op == 0)
{
int max = Imax(root,a,b, v);
fprintf(fout,"%d\n",max);
}
else
{
v[a] = b;
}
}
fclose(fin);
fclose(fout);
return 0;
}