Pagini recente » Cod sursa (job #2698913) | Cod sursa (job #218323) | Cod sursa (job #2478141) | Cod sursa (job #2554559) | Cod sursa (job #1420659)
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX 5000005
template <typename T>
class MyDeque {
public:
T *elements;
int capacity;
int head;
int tail;
int size;
MyDeque(int cap) {
capacity = cap;
head = cap / 2 - 1;
tail = cap / 2;
size = 0;
elements = new T[cap + 1];
}
~MyDeque() {delete[] elements;}
bool empty() {
return size == 0;
}
T back() {
if(size) {
return elements[(tail - 1) < 0 ? capacity : tail - 1];
}
return T();
}
T front() {
if(size)
return elements[(head + 1) > capacity ? 0 : head + 1];
return T();
}
void push_front(T elem) {
if(size >= capacity)
return;
++size;
elements[head] = elem;
head = (head - 1) < 0 ? capacity : head - 1;
}
void push_back(T elem) {
if(size >= capacity)
return;
++size;
elements[tail] = elem;
tail = (tail + 1) > capacity ? 0 : tail + 1;
}
void pop_front() {
if(empty())
return;
--size;
head = (head + 1) > capacity ? 0 : head + 1;
}
void pop_back() {
if(empty())
return;
--size;
tail = (tail - 1) < 0 ? capacity : tail - 1;
}
void print() {
if(!empty()) {
for(int i = (head + 1) > capacity ? 0 : head + 1; i != tail; i = (i + 1) > capacity ? 0 : i + 1)
cout << elements[i] << " ";
}
cout << endl;
}
};
int main() {
long long int n, k, *v;
long long int sum = 0;
scanf("%lld%lld", &n, &k);
MyDeque<long long int> dq(MAX);
v = new long long int[MAX];
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
for(int i = 0; i < k - 1; ++i) {
scanf("%lld", &v[i]);
while(!dq.empty() && v[i] < v[dq.back()]) {
dq.pop_back();
}
dq.push_back(i);
}
for(int i = k - 1; i < n; ++i) {
if(i - dq.front() >= k) {
dq.pop_front();
}
scanf("%lld\n", &v[i]);
while(!dq.empty() && v[i] < v[dq.back()]) {
dq.pop_back();
}
dq.push_back(i);
sum += 1LL * v[dq.front()];
}
delete[] v;
cout << sum << '\n';
return 0;
}