Cod sursa(job #2406288)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 15 aprilie 2019 16:51:43
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

#define int_pair std::pair <int, int>

class TwoStackDeque {
public:
    TwoStackDeque() {}

    int min() {return std::min((s1.empty() ? INT_MAX : s1.top().second), (s2.empty() ? INT_MAX : s2.top().second));}
    void insert(int val) {s1.push({val, (s1.empty() ? val : std::min(val, s1.top().second))});}

    int pop() {
        if (s2.empty()) while (!s1.empty())
            s2.push({s1.top().first, (s2.empty() ? s1.top().first : std::min(s2.top().second, s1.top().first))}), s1.pop();
        int removed = s2.top().first; s2.pop();
        return removed;
    }

protected:
    std::stack <int_pair> s1, s2;
};

int N, K;
TwoStackDeque deque;

std::ifstream input ("deque.in");
std::ofstream output("deque.out");

void readInput() {
    input >> N >> K;
}

void solveInput() {
    long long sum = 0;
    for (int i=1, X; i<K; ++i)
        input >> X, deque.insert(X);
    for (int i=K, X; i<=N; ++i)
        input >> X, deque.insert(X), sum += 1LL * deque.min(), deque.pop();
    output << sum << '\n';
}

int main()
{
    readInput();
    solveInput();

    return 0;
}