Pagini recente » Cod sursa (job #397825) | Cod sursa (job #2767546) | Cod sursa (job #1270688) | Cod sursa (job #1454059) | Cod sursa (job #1420630)
#include <iostream>
#include <stdio.h>
#include <deque>
using namespace std;
template <typename T>
class MyDeque {
public:
int *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) {
// cout << "yay " << elem << endl;
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() {
int n, k, *v;
long long int sum = 0;
scanf("%d%d", &n, &k);
MyDeque<int> dq(k);
v = new int[n];
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
for(int i = 0; i < k - 1; ++i) {
scanf("%d", &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("%d\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;
printf("%lld\n", sum);
return 0;
}