Cod sursa(job #1340514)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 11 februarie 2015 21:14:23
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <fstream>

using namespace std;

template <typename T>
class Deque {

    private:
        struct Node {

            T item;
            Node * prev, * next;

            Node(T newItem) {
                prev = next = nullptr;
                item = newItem;
            }
        };

        Node * first, * last;

    public:
        Deque() {
            first = last = nullptr;
        }

        void push_front(T newItem) {

            Node * node = new Node(newItem);

            if(first == nullptr)
                first = last = node;
            else {
                first->prev = node;
                node->next = first;
                first = node;
            }
        }

        void pop_front() {

            if(first == nullptr)
                return;

            if(first->next == nullptr)
                first = last = nullptr;
            else {
                first = first->next;
                delete first->prev;
                first->prev = nullptr;
            }
        }

        void push_back(T newItem) {

            Node * node = new Node(newItem);

            if(last == nullptr)
                first = last = node;
            else {
                last->next = node;
                node->prev = last;
                last = node;
            }
        }

        void pop_back() {

            if(last == nullptr)
                return;

            if(last->prev == nullptr)
                first = last = nullptr;
            else {
                last = last->prev;
                delete last->next;
                last->next = nullptr;
            }
        }

        Node * begin() {
            return first;
        }

        Node * end() {
            return last;
        }

        T front() {
            return first->item;
        }

        T back() {
            return last->item;
        }

        bool empty() {
            return (first == nullptr);
        }
};

Deque < pair<int, int> > deq;
int N, K;
long long Answer;

int main() {

    int i, x;
    ifstream in("deque.in");
    ofstream out("deque.out");

    in >> N >> K;
    for(i = 1; i <= N; i++) {

        for(in >> x; !deq.empty() && deq.back().second > x; deq.pop_back());

        deq.push_back(make_pair(i, x));

        if(deq.front().first <= i - K)
            deq.pop_front();

        if(i >= K)
            Answer += deq.front().second;
    }

    out << Answer << '\n';

    in.close();
    out.close();

    return 0;
}