Pagini recente » Cod sursa (job #1393161) | Cod sursa (job #107354) | Cod sursa (job #1111191) | Cod sursa (job #1525492) | Cod sursa (job #2811393)
#include <cstdio>
#include <iostream>
using namespace std;
const int N=5000000+7;
int n,k,a[N],d[N],st,dr;
void add(int x){/// adauga pe x la final
dr++;
d[dr]=x;
}
void popback() {/// sterge elementul de la final
dr--;
}
void popfront() {/// sterge elementul de la inceput
st++;
}
signed main() {
freopen ("deque.in","r",stdin);
freopen ("deque.out","w",stdout);
st=1;
dr=0;
/**
st=dr => am un singur element
st,dr-1
st,st-1
d[1]=0
1...0
de la st la dr => st<=i<=dr
1<=i<=0
st...dr
st=4
dr=8
d[4], d[5], d[6], d[7], d[8]
adauga elementul 10
primul element este d[st]
al doilea d[st+1]
....
ultimul d[dr]
1 2 3 4 5 ... n
(2 3 4 5 6 7 8 9)
**/
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
long long sum=0;
for (int i=1;i<=n;i++){
while (st<=dr&&a[i]<=a[d[dr]]){
dr--;
}
add(i);
if(d[st]<=i-k) {
popfront();
}
if(i>=k){
sum+=a[d[st]];
}
}
printf("%lld\n",sum);
return 0;
}
/**
**/