#include <stdio.h>
#include <stdlib.h>
#define NMAX 100009
int v[NMAX], tree[4*NMAX+3];
int max(int x, int y)
{
if(x>y)
return x;
else return y;
}
void build_tree(int node,int left,int right)
{
if(left==right)
{
tree[node]=v[left];
return;
}
int middle=(left+right)/2;
build_tree(2*node,left,middle);
build_tree(2*node+1,middle+1,right);
tree[node]=max(tree[2*node],tree[2*node+1]);
}
void update(int node,int left,int right,int idx,int value)
{
if(left==right)
{
tree[node]=value;
return;
}
int middle=(left+right)/2;
if(idx<=middle)
update(2*node,left,middle,idx,value);
else
update(2*node+1,middle+1,right,idx,value);
tree[node]=max(tree[2*node],tree[2*node+1]);
}
int query(int node,int left,int right,int x,int y)
{
if(x<=left && right<=y)
{
return tree[node];
}
if(y<left || x>right)
{
return 0;
}
int middle=(left+right)/2;
int l=query(2*node,left,middle,x,y);
int r=query(2*node+1,middle+1,right,x,y);
return max(l,r);
}
int main(void)
{
FILE *fin=fopen("arbint.in","r"), *fout=fopen("arbint.out","w");
if(fin==NULL)
{
fprintf(stderr,"error when opening file");
exit(-1);
}
if(fout==NULL)
{
fprintf(stderr,"error when opening file");
exit(-1);
}
int N,M;
fscanf(fin,"%d %d",&N,&M);
for (int i = 1; i <= N; i++)
{
fscanf(fin, "%d", &v[i]);
}
build_tree(1,1,N);
for(int i=0;i<M;i++)
{
int type,x,y;
fscanf(fin,"%d %d %d",&type,&x,&y);
if(type==0)
{
int rez=query(1,1,N,x,y);
fprintf(fout,"%d\n",rez);
}
else
{
update(1,1,N,x,y);
}
}
if(fclose(fin)!=0)
{
fprintf(stderr,"error when closing file");
exit(-1);
}
if(fclose(fout)!=0)
{
fprintf(stderr,"error when closing file");
exit(-1);
}
return 0;
}