#include<stdio.h>
#include<stdlib.h>
#define MAX 400002
#define max(a, b) (a > b ? a : b)
#define inpath "arbint.in"
#define outpath "arbint.out"
void update(int st, int dr, int nod, int poz, int val, int *v)
{
if(st == dr)
{
v[nod] = val;
return;
}
int mid = (st + dr) / 2;
if(poz <= mid)
{
update(st, mid, 2 * nod, poz, val, v);
}
else
{
update(mid + 1, dr, 2 * nod + 1, poz, val, v);
}
v[nod] = max(v[2 * nod], v[2 * nod + 1]);
}
int querry(int st, int dr, int nod, int a, int b, int *v)
{
if(a <= st && dr <= b)
{
return v[nod];
}
int mid = (st + dr) / 2;
int val1 = 0, val2 = 0;
if(a <= mid)
{
val1 = querry(st, mid, 2 * nod, a, b, v);
}
if(b > mid)
{
val2 = querry(mid + 1, dr, 2 * nod + 1, a, b, v);
}
return max(val1, val2);
}
int main()
{
int n = 0, m = 0, v[MAX];
FILE *in = NULL, *out = NULL;
if( (in = fopen(inpath, "r")) == NULL )
{
printf("Eroare la deschiderea fisierului %s.\n", inpath);
exit(EXIT_FAILURE);
}
if( (out = fopen(outpath, "w")) == NULL )
{
printf("Eroare la deschiderea fisierului %s.\n", outpath);
exit(EXIT_FAILURE);
}
if( fscanf(in, "%d %d", &n, &m) != 2 )
{
printf("Eroare la citirea din fisierul %s.\n", inpath);
exit(EXIT_FAILURE);
}
int valoare = 0;
for(int i = 0; i < n; i++)
{
if( fscanf(in, "%d", &valoare) != 1 )
{
printf("Eroare la citirea din fisierul %s.\n", inpath);
exit(EXIT_FAILURE);
}
update(1, n, 1, i + 1, valoare, v);
}
int operatie = 0, a = 0, b = 0;
for(int i = 0; i < m; i++)
{
if( fscanf(in, "%d %d %d", &operatie, &a, &b) != 3 )
{
printf("Eroare la citirea din fisierul %s.\n", inpath);
exit(EXIT_FAILURE);
}
if( operatie == 1 )
{
update(1, n, 1, a, b, v);
}
else
{
fprintf(out, "%d\n", querry(1, n, 1, a, b, v));
}
}
if( fclose(in) != 0 )
{
printf("Eroare la inchiderea fisierului %s.\n", inpath);
exit(EXIT_FAILURE);
}
if( fclose(out) != 0 )
{
printf("Eroare la inchiderea fisierului %s.\n", outpath);
exit(EXIT_FAILURE);
}
return 0;
}