Pagini recente » Cod sursa (job #188624) | Cod sursa (job #2215881) | Cod sursa (job #445620) | Autentificare | Cod sursa (job #1340514)
#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;
}