Pagini recente » Cod sursa (job #2693449) | Cod sursa (job #711092) | Cod sursa (job #1503003) | Cod sursa (job #1737006) | Cod sursa (job #3127631)
#include <iostream>
#include <stack>
#include <fstream>
#include <vector>
std::ifstream in("deque.in");
std::ofstream out("deque.out");
class Deque
{
private:
long long capacity = 0;
struct Node
{
Node(int cheie) : key(cheie), next(nullptr), prev(nullptr) {}
int key;
Node* next;
Node* prev;
};
Node* front;
Node* rear;
public:
Deque() : front(nullptr), rear(nullptr), capacity(0) {}
void push_front(int x)
{
capacity++;
Node* new_el = new Node(x);
if (front == nullptr || rear == nullptr)
{
front = new_el;
rear = new_el;
}
else
{
new_el->next = front;
front->prev = new_el;
front = new_el;
}
}
void push_rear(long long x)
{
capacity++;
Node* new_el = new Node(x);
if (front == nullptr || rear == nullptr)
{
front = new_el;
rear = new_el;
}
else
{
new_el->prev = rear;
rear->next = new_el;
rear = new_el;
}
}
void pop_front()
{
capacity--;
Node* aux = front;
if (front == nullptr || rear == nullptr)
rear = nullptr;
else
{
if (front->next != nullptr)
{
front = front->next;
front->prev = nullptr;
}
else
{
front = nullptr;
rear = nullptr;
}
}
}
bool empty()
{
return front == nullptr;
}
void pop_rear()
{
capacity--;
Node* aux = rear;
if (rear == nullptr)
{
rear = nullptr;
front = nullptr;
}
else
{
if (rear->prev != nullptr)
{
rear = rear->prev;
rear->next = nullptr;
}
else
{
rear = nullptr;
front = nullptr;
}
}
}
int get_front()
{
return front->key;
}
long long int get_rear()
{
return rear->key;
}
long long int get_capacity()
{
return capacity;
}
void printIt()
{
Node* eu = front;
while (eu != nullptr)
{
out << eu->key << " ";
eu = eu->next;
}
out << std::endl;
}
};
int main()
{
long long int n,k;
int s = 0;
in >> n >> k;
std::vector<int> v;
Deque deq;
for (long long i = 0; i < n; i++)
{
int x;
in >> x;
v.push_back(x);
}
for (long long i = 0; i < n; i++)
{
while ( !deq.empty() && v[i] <= v[deq.get_rear()])
deq.pop_rear();
if (!deq.empty() && deq.get_front() == i - k)
deq.pop_front();
deq.push_rear(i);
if (i >= k - 1)
s += v[deq.get_front()];
}
out << s;
return 0;
}