Pagini recente » Cod sursa (job #622824) | Cod sursa (job #2108795) | Cod sursa (job #1839215) | Cod sursa (job #274117) | Cod sursa (job #739367)
Cod sursa(job #739367)
#include <cstdio>
#include <fstream>
#define LE 5000005
#define inf 500000000
#define ll long long
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct two
{
ll val,poz;
} H[LE];
ll dreapta,stanga,el[LE],l[LE],N,i,n,k,suma;
void up(ll X)
{
while (X!=1&&H[X].val<H[X/2].val)
{
swap(el[H[X].poz],el[H[X/2].poz]);
swap(H[X],H[X/2]);
X=X/2;
}
}
void down(ll X)
{
ll okz;
if (X*2<=N)
do
{
stanga=H[X*2].val;
okz=0;
if (X*2==N) dreapta=inf;
else dreapta=H[X*2+1].val;
if (H[X].val>stanga||H[X].val>dreapta)
{
okz=1;
if (stanga<dreapta)
{
swap(el[H[X].poz],el[H[X*2].poz]);
swap(H[X],H[X*2]);
}
else
{
swap(el[H[X].poz],el[H[X*2+1].poz]);
swap(H[X],H[X*2+1]);
}
}
}
while (X*2<=N&&okz);
}
void adaug()
{
H[++N].poz=i;
el[i]=N;
H[N].val=l[i];
up(N);
}
ll sterg(ll X)
{
swap(H[X],H[N]);
el[H[X].poz]=X;
N--;
if (X>1&&H[X].val<H[X/2].val) up(X);
else
down(X);
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%lld%lld",&n,&k);
for(i=1; i<=n; ++i)
scanf ("%lld",&l[i]);
for(i=1; i<=n; ++i)
{
adaug();
if (i>k)
sterg(el[i-k]);
if (i>=k)
suma+=H[1].val;
}
printf("%lld\n",suma);
f.close();
g.close();
return 0;
}