Pagini recente » Cod sursa (job #855666) | Cod sursa (job #1486140) | Cod sursa (job #868754) | Cod sursa (job #705026) | Cod sursa (job #1052598)
#include<stdio.h>
#define max 10000000
int h[5000013],m,n,i,j,k,el[625013];
long long s;
struct point
{
int x;
point *y;
}*p,*u,*q;
inline void elimina(int x)
{
x+=max;
el[x/32]|=1<<(x%32);
}
inline bool trebuie(int x)
{
x+=max;
if(el[x/32]&(1<<(x%32)))return 1;
return 0;
}
inline void swap(int a,int b)
{
int aux=h[a];
h[a]=h[b];
h[b]=aux;
}
void heapup(int i)
{
if(i==1)return;
if(h[i]<h[i/2])
{
swap(i,i/2);
heapup(i/2);
}
}
void heapdown(int i)
{
if(i*2>n)return;
int st,dr;
st=h[i*2];
if(i*2+1>n)dr=st+1;
else dr=h[i*2+1];
if(h[i]<st && h[i]<dr)return;
if(st<dr)
{
swap(i,i*2);
heapdown(i*2);
}
else
{
swap(i,i*2+1);
heapdown(i*2+1);
}
}
void gtfo()
{
swap(1,n);
--n;
heapdown(1);
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%d%d",&m,&k);
s=0;
p=new point;
p->y=NULL;
u=p;
for(i=1;i<k;++i)
{
scanf("%d",&h[i]);
q=new point;
q->x=h[i];
q->y=NULL;
u->y=q;
u=q;
heapup(i);
}
q=p;
p=p->y;
delete(q);
n=k-1;
for(i=k;i<=m;++i)
{
++n;
scanf("%d",&h[n]);
q=new point;
q->x=h[n];
q->y=NULL;
u->y=q;
u=q;
heapup(n);
s+=h[1];
elimina(p->x);
q=p;
p=p->y;
delete(q);
while(trebuie(h[1]))gtfo();
}
printf("%lld",s);
return 0;
}