Cod sursa(job #1480947)

Utilizator retrogradLucian Bicsi retrograd Data 3 septembrie 2015 14:59:54
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <stack>
#include <iostream>

using namespace std;

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

struct TwoStackQueue {
    int St[2][5000005], Min[2][5000005];
    int E[2];

    TwoStackQueue() {
        Min[0][0] = Min[1][0] = 20000000;
    }

    void pushIn(bool x, int val) {
        ++E[x];
        St[x][E[x]] = val;
        Min[x][E[x]] = min(Min[x][E[x]-1], val);
    }


    void push_back(int x) {
        pushIn(0, x);
    }

    int getMin() {
        return min(Min[0][E[0]], Min[1][E[1]]);
    }

    void pop_front() {
        if(!E[1]) {
            while(E[0]) {
                pushIn(1, St[0][E[0]]);
                E[0]--;
            }
        }
        E[1]--;
    }

};
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();
        Q.pop_front();
    }
    fout<<sum;

    return 0;
}