Pagini recente » Cod sursa (job #900309) | Cod sursa (job #1581991) | Infoarena Monthly 2012 - Runda 7, Clasament | Cod sursa (job #470546) | Cod sursa (job #739361)
Cod sursa(job #739361)
#include <cstdio>
#include <fstream>
#define LE 5000005
#define inf 5000000
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct two
{
int val,poz;
} H[LE];
int dreapta,stanga,el[LE],l[LE],N,i,n,k,suma;
void up(int 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(int X)
{
int 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);
}
int sterg(int 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("%ld%ld",&n,&k);
for(i=1; i<=n; ++i)
scanf ("%ld",&l[i]);
for(i=1; i<=n; ++i)
{
adaug();
if (i>k)
sterg(el[i-k]);
if (i>=k)
suma+=H[1].val;
}
printf("%ld\n",suma);
f.close();
g.close();
return 0;
}