Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
for (k = 1; k < 524288; k += 2)
if (k<N) scanf("%f", &a[k]);
else a[k] = a[k-2];
long s = 2;
while (s < 524288) {
j = s >> 1;
for(k = s; k < 524288; k += (s << 1))
a[k] = (a[k - j] < a[k + j]) ? a[k - j] : a[k + j];
s <<= 1;
}
float minf;
void addmin(long z) {
float c = a[(z << 1) + s];
if (c < minf) minf = c;
}
s = 1;
scanf("%ld %ld", &i, &j);
minf = a[(i << 1) + 1];
while (i != j) {
if(i & s) {
addmin(i);
i += s;
}
if(j & s) {
j -= s;
addmin(j);
}
s <<= 1;
}Лирическое отступление. Заметим, что в качестве основания логарифма можно брать любое число, т.к. logan всегда отличается от logbc ровно в константное число раз. Константа, как мы помним из курса школьной алгебры равна logab.
Задача RMQ — 1. Static RMQ