Pagini recente » Cod sursa (job #3224915) | Cod sursa (job #3173033) | Cod sursa (job #1167663) | Cod sursa (job #2207405) | Cod sursa (job #1053603)
#include<cstdio>
#include<iostream>
#define dim 5000003
using namespace std;
int pos[dim],h[dim],N,a[dim];
inline int rs(int nod){
return 2*nod+1;
}
inline int ls(int nod){
return 2*nod;
}
void urca(int k){
while( k>1 && a[h[k>>1]]>a[h[k]]){
swap(pos[h[k]],pos[h[k>>1]]);
swap(h[k],h[k>>1]);
k>>=1;
}
}
void coboara( int nod){
int fiu=nod;
if(ls(nod)<=N && a[h[fiu]]>a[h[ls(nod)]] ){
fiu=ls(nod);
}
if(rs(nod)<=N && a[h[fiu]]>a[h[rs(nod)]]){
fiu=rs(nod);
}
if(nod!=fiu){
swap(pos[h[nod]],pos[h[fiu]]);
swap(h[fiu],h[nod]);
coboara(fiu);
}
}
void insert( int X ){
h[++N]=X;
pos[X]=N;
urca(pos[X]);
}
void erase( int X ){
swap(pos[h[X]],pos[h[N]]);
swap(h[X],h[N]);
--N;
coboara(X);
}
int main () {
int k,n;
long long sum=0;
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<k;++i){
scanf("%d",&a[i]);
insert(i);
}
for(int i=k;i<=n;++i){
scanf("%d",&a[i]);
insert(i);
while(h[1]<i-k+1)
erase(1);
sum+=a[h[1]];
}
printf("%lld",sum);
return 0;
}