Pagini recente » Cod sursa (job #1375174) | Cod sursa (job #1741557) | Cod sursa (job #1789683) | Cod sursa (job #449288) | Cod sursa (job #743377)
Cod sursa(job #743377)
#include <cstdio>
#include <fstream>
#define LE 6050050
#define inf 50000000
#define ll long long
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int dreapta,stanga,poz[LE],V[LE],N,i,n,k,okz,H[LE],C;
ll suma;
int UP(int D)
{
while (D>1&&V[H[D/2]]>V[H[D]])
{
poz[H[D]]=D/2;
poz[H[D/2]]=D;
swap(H[D],H[D/2]);
D/=2;
}
}
int DOWN(int D)
{
if (D*2<=N){
do
{
okz=0;
if( V[H[D*2]]<V[H[D]] || V[H[D*2+1]]<V[H[D]] )
{
okz=1;
C=2*D;
if (D*2<N&&V[H[C]]>V[H[D*2+1]])
C=2*D+1;
poz[H[D]]=C;
poz[H[C]]=D;
swap(H[D],H[C]);
D=C;
}
}
while(okz&&D<=N/2);
}
}
int adaug(int Vpoz)
{
H[++N]=Vpoz;
poz[Vpoz]=N;
UP(N);
}
int sterg(int Vpoz)
{
int Hpoz=poz[Vpoz];
swap(H[Hpoz],H[N]);
H[N--]=0;
poz[H[Hpoz]]=Hpoz;
UP(Hpoz);
DOWN(Hpoz);
}
int main()
{
f>>n>>k;
for(i=1; i<=n; ++i)
f>>V[i];
V[0]=inf;
for(i=1; i<=n; ++i)
{
if (i>k)
sterg(i-k);
adaug(i);
if (i>=k)
suma+=V[H[1]];
}
g<<suma<<'\n';
f.close();
g.close();
return 0;
}