Минимум на неизменяемом отрезке О(NlogN + KlogN)
Дан массив из N целых чисел и K запросов, состоящих из двух индексов.
Необходимо для каждого запроса вывести минимальный из элементов, расположенных между индексами в запросе.
Будем использовать дерево отрезков. Тогда все запросы и события будут выполняться за O(logN).
Асимптотика O(NlogN + KlogN).
Листинг C++
class tree
{
public :
int a;
int Min;
int l, r;
tree * left, * right;
tree (int _l, int _r)
{
l = _l;
r = _r;
a = 1e9;
Min = 1e9;
if (l == r) return ;
int m = (l + r) / 2;
left = new tree (l, m);
right = new tree (m + 1, r);
}
void modify (int i, int x) // изменение i-того элемента
{
if (l == r && l == i)
{
a = x;
Min = x;
return ;
}
int m = (l + r) / 2;
if (l <= i && i <= m)
left->modify (i, x);
else
right->modify (i, x);
Min = min (left->Min, right->Min);
}
int minimum (int _l, int _r) // минимум элементов от i до j
{
_l = max (_l, l);
_r = min (_r, r);
if (_l == l && _r == r) return Min;
int ans = 1e9;
if (left->l <= _l && _l <= left->r)
ans = left->minimum (_l, _r);
if (right->l <= _r && _r <= right->r)
ans = min (ans, right->minimum (_l, _r));
return ans;
}
};
14:26
05.08.2009
По всем вопросам обращаться: rumterg@gmail.com