Cod sursa(job #1480950)

Utilizator retrogradLucian Bicsi retrograd Data 3 septembrie 2015 15:01:31
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <stack>
#include <iostream>

using namespace std;

ifstream fin("deque.in");
ofstream fout("deque.out");

struct TwoStackQueue {
    stack<pair<int, int>> St[2];

    void pushIn(bool x, int val) {
        int m = val;
        if(!St[x].empty())
            m = min(m, St[x].top().second);

        St[x].push({val, m});
    }

    void push_back(int x) {
        pushIn(0, x);
    }
    int getMin() {
        if(St[0].empty()) return St[1].top().second;
        if(St[1].empty()) return St[0].top().second;

        return min(St[0].top().second, St[1].top().second);
    }

    void pop_front() {
        if(St[1].empty()) {
            while(!St[0].empty()) {
                int x = St[0].top().first;
                St[0].pop();
                pushIn(1, x);
            }
        }
        St[1].pop();
    }

};
TwoStackQueue Q;

int main() {
    int n, k, val;

    fin>>n>>k;
    for(int i=1; i<k; i++) {
        fin>>val;
        Q.push_back(val);
    }

    int64_t sum = 0;
    for(int i=k; i<=n; i++) {
        fin>>val;
        Q.push_back(val);
        sum += Q.getMin();
        //cout<<Q.getMin()<<" ";
        Q.pop_front();
    }
    fout<<sum;

    return 0;
}