The queue method is popular, but there's a much faster (branch-free) and in my opinion simpler way, known as the van Herk/Gil-Werman algorithm in image processing. It splits the input into windows and pairs up a backward scan on one window with a forward scan on the next. This works for any associative function. I was very surprised when I learned about it that it's not taught more often (the name's not doing it any favors)! And I wrote a tutorial page on it for my SIMD-oriented language, mostly about vectorizing it which I didn't quite finish writing up, but with what I think is a reasonable presentation in the first part: <a href="https://github.com/mlochbaum/Singeli/blob/master/doc/minfilter.md">https://github.com/mlochbaum/Singeli/blob/master/doc/minfilt...</a><p>I also found an interesting streaming version here recently: <a href="https://signalsmith-audio.co.uk/writing/2022/constant-time-peak-hold/" rel="nofollow">https://signalsmith-audio.co.uk/writing/2022/constant-time-p...</a><p>EDIT: On closer inspection, this method is equivalent to the one I described, and not the one I'm used to seeing with queues (that starts my tutorial). The stack-reversing step is what forms a backwards scan. The combination of turning it sequential by taking in one element at a time but then expressing this in functional programming makes for a complicated presentation, I think.