#include <stdio.h>
#include <stdlib.h>
#define N_MAX 100001
int tree[4 * N_MAX + 5];
int max(int a, int b)
{
if(a >= b)
{
return a;
}
else
{
return b;
}
}
void update(int node, int le, int ri, int pos, int val) // node 1 left 1 right n
{
if(le == ri)
{
tree[node] = val;
return;
}
int mid = (le + ri) / 2;
if(pos <= mid)
{
update(2 * node, le, mid, pos, val);
}
else
{
update(2 * node + 1, mid + 1, ri, pos, val);
}
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void query(int node, int le, int ri, int x, int y, int *ans)
{
if(x <= le && ri <= y)
{
*ans = max(*ans, tree[node]);
return;
}
int mid = (le + ri) / 2;
if(x <= mid)
{
query(2 * node, le, mid, x, y, ans);
}
if(y > mid)
{
query(2 * node + 1, mid + 1, ri, x, y, ans);
}
}
int main ()
{
int n = 0;
int m = 0;
FILE *file_in = NULL;
FILE *file_out = NULL;
if((file_in = fopen("arbint.in","r")) == NULL)
{
perror("EROARE LA DESCHIDEREA FISIERULUI DE CITIRE !");
exit(-1);
}
if((file_out = fopen("arbint.out","w")) == NULL)
{
perror("EROARE LA DESCHIDEREA FISIERULUI DE SCRIERE !");
exit(-1);
}
fscanf(file_in,"%d %d", &n, &m);
int i = 0;
int valoare = 0;
for(i=1;i<=n;i++)
{
fscanf(file_in,"%d",&valoare);
update(1,1,n,i,valoare);
}
int x = 0;
int a = 0;
int b = 0;
for(i=1;i<=m;i++)
{
fscanf(file_in, "%d %d %d", &x, &a, &b);
if(x == 0) // query
{
int maxim = -1;
query(1,1,n,a,b,&maxim);
fprintf(file_out,"%d \n",maxim);
}
else // update
{
update(1,1,n,a,b);
}
}
fclose(file_in);
fclose(file_out);
return 0;
}