Pagini recente » Cod sursa (job #1572164) | Cod sursa (job #2456935) | Cod sursa (job #520899) | Cod sursa (job #2866893) | Cod sursa (job #2885983)
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
#include <vector>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
const int NMAX=5e6+3;
class Deque{
int *d,st,dr,size;
public:
Deque(int size=0){
st=-1;
dr=-1;
this->size=size;
d=new int[size];
}
void push_back(int val);
void pop_back();
void push_front(int val);
void pop_front();
int front(){
if(!empty())
return d[st];
return -1;
}
int back(){
if(!empty())
return d[dr];
return -1;
}
bool full(){
return ((st==0 && dr==size-1) || st==dr+1);
}
bool empty(){
return (st==-1);
}
};
void Deque::push_back(int val) {
if(full())
return;
if(st==-1)
st=dr=0;
else if(dr==size-1)
dr=0;
else
dr++;
d[dr]=val;
}
void Deque::pop_back(){
if(empty())
return;
if(dr==st)
st=-1;
else if(dr==0)
dr=size-1;
else
dr--;
}
void Deque::push_front(int val){
if(full())
return;
if(st==-1)
st=dr=0;
else if(st==0)
st=size-1;
else
st--;
d[st]=val;
}
void Deque::pop_front(){
if(empty())
return;
if(dr==st)
st=-1;
else if(st==size-1)
st=0;
else
st++;
}
int d[NMAX],v[NMAX];
int main() {
int dr=0,n,k;
long long sum=0;
in>>n>>k;
Deque d(n);
for(int i=0;i<n;i++)
in>>v[i];
for(int i=0;i<n;i++){
while(!d.empty() && v[d.front()]>v[i])
d.pop_front();
while(!d.empty() && i-d.back()>=k)
d.pop_back();
d.push_front(i);
if(i>=k-1){
sum+=1LL*v[d.back()];
}
}
out<<sum;
return 0;
}