Pagini recente » Cod sursa (job #613229) | Cod sursa (job #2726343)
#include <iostream>
#include <fstream>
#include <deque>
class Deque {
struct Node {
int val;
Node* prev;
Node* next;
Node(int x) : val(x), prev(nullptr), next(nullptr) {}
};
Node* left;
Node* right;
public:
Deque() : left(nullptr), right(nullptr) {}
void pushLeft(int x)
{
Node* n = new Node(x);
if (left == nullptr)
left = right = n;
else
{
left->prev = n;
n->next = left;
left = n;
}
}
void pushRight(int x)
{
Node* n = new Node(x);
if (right == nullptr)
left = right = n;
else
{
right->next = n;
n->prev = right;
right = n;
}
}
int popLeft()
{
if (left == nullptr)return -1;
Node* temp = left;
int x = temp->val;
if (left == right)
{
left = right = nullptr;
}
else
{
left = left->next;
}
delete temp;
return x;
}
int popRight()
{
if (right == nullptr)return -1;
Node* temp = right;
int x = temp->val;
if (left == right)
{
left = right = nullptr;
}
else {
right = right->prev;
}
delete temp;
return x;
}
int peekLeft() { return left == nullptr ? -1 : left->val; }
int peekRight() { return right == nullptr ? -1 : right->val; }
bool isEmpty() { return left == nullptr; }
~Deque()
{
while (left != nullptr)
{
Node* temp = left;
left = left->next;
delete temp;
}
}
};
int v[5000000];
int main()
{
std::ifstream f("deque.in");
std::ofstream g("deque.out");
Deque deq;
int n,k;
long long rez = 0;
f >> n >> k;
for (int i = 0; i < n; ++i)
f >> v[i];
for (int i = 0; i < n; ++i)
{
while (!deq.isEmpty() && v[deq.peekRight()] >= v[i])
deq.popRight();
deq.pushRight(i);
if (i < k - 1)continue;
if (deq.peekLeft() <= i - k)
deq.popLeft();
rez += v[deq.peekLeft()];
}
g << rez;
}