Pagini recente » Cod sursa (job #749602) | Cod sursa (job #2920058) | Cod sursa (job #2371633) | Cod sursa (job #3222633) | Cod sursa (job #2217697)
#include <bits/stdc++.h>
using namespace std;
struct Node{
int value;
int ind;
Node *prev, *next;
};
class Deque{
public:
Deque(){
first = nullptr;
last = nullptr;
}
int Empty(){
if(first == nullptr)
return 1;
return 0;
}
void PushFirst(int value, int ind){
Node *aux = new Node;
aux->value = value;
aux->ind = ind;
if(nullptr == first){
aux->prev = aux->next = nullptr;
first = last = aux;
return;
}
aux->prev = nullptr;
aux->next = first;
first->prev = aux;
first = aux;
return;
}
void PushLast(int value, int ind){
Node *aux = new Node;
aux->value = value;
aux->ind = ind;
if(nullptr == first){
aux->prev = aux->next = nullptr;
first = last = aux;
return;
}
aux->next = nullptr;
aux->prev = last;
last->next = aux;
last = aux;
return;
}
void PopFirst(){
if(first == last){
delete first;
first = last = nullptr;
return;
}
Node *aux = first;
first = first->next;
first->prev = nullptr;
delete aux;
}
void PopLast(){
if(first == last){
delete first;
first = last = nullptr;
return;
}
Node *aux = last;
last = last->prev;
last->next = nullptr;
delete aux;
}
int GetFirstValue(){
return first->value;
}
int GetLastValue(){
return last->value;
}
int GetFirstIndex(){
return first->ind;
}
int GetLastIndex(){
return last->ind;
}
private:
Node *first;
Node *last;
};
const int NMax = 5000003;
int n,k;
int main(){
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%d%d",&n,&k);
Deque *deq = new Deque;
long long ans = 0;
for(int i = 1; i <= n; ++i){
int x;
scanf("%d",&x);
if(deq->Empty()){
deq->PushLast(x,i);
continue;
}
if(i - k + 1 > deq->GetFirstIndex())
deq->PopFirst();
while(!deq->Empty() && x <= deq->GetLastValue())
deq->PopLast();
deq->PushLast(x,i);
if(i >= k)
ans += 1LL*deq->GetFirstValue();
}
printf("%lld\n",ans);
return 0;
}