Pagini recente » Cod sursa (job #2431094) | Cod sursa (job #1590826) | Cod sursa (job #1784658) | Cod sursa (job #1714026) | Cod sursa (job #308175)
Cod sursa(job #308175)
#include <iostream>
FILE *f = fopen("arbint.in", "r"), *g = fopen("arbint.out", "w");
int *a, maxim = -1, start, finish, N, M;
long n = 0;
using namespace std;
int update(int i, int x)
{
int li = 0, ls = N - 1, poz = 0;
if (a[poz] < x)
{
a[poz] = x;
}
while ((li < ls) && (ls))
{
int m = (li + ls) / 2;
if (i <= m)
{
ls = m;
poz = 2 * poz + 1;
if (a[poz] < x) a[poz] = x;
}
else
{
li = m + 1;
poz = 2 * poz + 2;
if (a[poz] < x) a[poz] = x;
}
}
a[poz] = x;
while (poz)
{
int t = (poz - 1) / 2;
a[t] = max(a[2 * t + 1], a[2 * t + 2]);
poz = (poz - 1) / 2;
}
return 0;
}
void query(int nod, int li, int ls)
{
if ((start <= li) && (ls <= finish))
{
if (a[nod] > maxim) maxim = a[nod];
return ;
}
int m = (li + ls) / 2;
if (start <= m) query(2 * nod + 1, li, m);
if (finish >= m + 1) query(2 * nod + 2, m + 1, ls);
}
int main()
{
fscanf(f, "%d %d", &N, &M);
int j = 1;
while (j < 2 * N)
{
n += j;
j *= 2;
}
a = new int[n];
for (int i = 0; i < n; ++i)
{
a[i] = 0;
}
for (int i = 0; i < N; ++i)
{
int x;
fscanf(f, "%d", &x);
update(i, x);
}
for (int i = 0; i < M; ++i)
{
int x, y, z;
fscanf(f, "%d %d %d", &x, &y, &z);
if (x)
{
update(y - 1, z);
}
else
{
maxim = -1;
start = y - 1;
finish = z - 1;
query(0, 0, N - 1);
fprintf(g, "%d\n", maxim);
}
}
fclose(f);
fclose(g);
delete[] a;
return 0;
}