Cod sursa(job #2763565)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 15 iulie 2021 00:31:24
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include "bits/stdc++.h"
#include <cassert>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;
ifstream cin("deque.in");
ofstream cout("deque.out");


int main()
{
    stack<pi> s1, s2;

    auto get_min = [&]() -> int
    {
        assert(!(s1.empty() && s2.empty()));
        if (s1.empty())
        {
            return s2.top().second;
        }
        if (s2.empty())
        {
            return s1.top().second;
        }
        return min(s1.top().second, s2.top().second);
    };

    auto add = [&](const int nr) -> void
    {
        const int new_min = s1.empty() ? nr : min(nr, s1.top().second);
        s1.emplace(nr, new_min);
    };

    auto remove = [&]() -> void
    {
        if (s2.empty())
        {
            while (!s1.empty())
            {
                const int del_elem = s1.top().first;
                s1.pop();
                if (s2.empty())
                {
                    s2.emplace(del_elem, del_elem);
                }
                else
                {
                    s2.emplace(del_elem, min(del_elem, s2.top().second));
                }
            }
        }
        s2.pop();
    };

    int N, K;
    ::cin >> N >> K;

    int i{};
    for (int nr; i < K - 1; ::cin >> nr, add(nr), ++i)
        ;
    ll ans{};
    for (int nr; i < N; ::cin >> nr, add(nr), ans += get_min(), remove(), ++i)
        ;

    ::cout << ans;
}