Pagini recente » Cod sursa (job #1853074) | Cod sursa (job #2284663) | Cod sursa (job #2495725) | Cod sursa (job #1679223) | Cod sursa (job #1053624)
#include<fstream>
#define dim 5000050
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int pos[2*dim],h[2*dim],N,a[dim];
long long sum;
void urca(int k){
while( k>1 && a[h[k/2]]>a[h[k]]){
swap(pos[h[k]],pos[h[k/2]]);
swap(h[k],h[k/2]);
k/=2;
}
}
void coboara( int nod){
int fiu=nod;
int rs=2*nod+1;
int ls=2*nod;
if(ls<=N && a[h[fiu]]>a[h[ls]] ){
fiu=ls;
}
if(rs<=N && a[h[fiu]]>a[h[rs]]){
fiu=rs;
}
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;
f>>n>>k;
for(int i=1;i<k;++i){
f>>a[i];
insert(i);
}
for(int i=k;i<=n;++i){
f>>a[i];
if(a[i]<=a[h[1]]) {
++N;
h[N]=h[1];
h[1]=i;
pos[N]=pos[1];
pos[1]=i;
urca(N);
}
else
insert(i);
while(h[1]<i-k+1)
erase(1);
sum+=a[h[1]];
}
g<<sum<<"\n";
return 0;
}