Na początku analizowałem złożoność obliczeniową zaprezentowanego algorytmu i zatrzymałem się na tym konstrukcie:
while(get_maximum_() > tab[r].second){
pop_(l);
++l;
}
Rozwijając ten kod otrzymujemy coś takiego:
while(kolejka.front().first > tab[r].second) {
// funkcja pop_
if(!kolejka.empty() && kolejka.front().second == l)
kolejka.pop_front();
++l;
}
Generalnie program jest dla mnie bardzo ciężki w analizie przez enigmatyczne nazwy zmiennych ("l"), ale udało mi się wprowadzić program w bardzo długie czasy wykonania, dostarczając po prostu zera. Dając takie dane jak poniżej, program zamyka się w tej pętli, nie będąc w stanie zdjąć elementów ze stosu, bo l jest już daleko większe niż 0.
0: 1 5
1: 4 8
2: 2 5
3: 6 8
4: 0 0
5: 0 0
Udało mi się również zrobić to z innymi liczbami (1, 5, -100). Program ewidentnie nie lubi dwóch następujących po sobie niskich wyników.
Generalnie program jest wykonany dość złożenie obliczeniowo i wydaje mi się, że jego wykonanie może nawet zająć O(n^2) w najbardziej pesymistycznym momencie. Proponowałbym wersję, bez jakiejkolwiek pamięci w postaci listy/kolejki.