Pagini recente » Cod sursa (job #2317408) | Cod sursa (job #2444119) | Cod sursa (job #740577) | Cod sursa (job #451934) | Cod sursa (job #1028662)
#include <iostream>
#include <stdio.h>
using namespace std;
FILE *f=fopen("deque.in","r");
FILE *g=fopen("deque.out","w");
int n,k,i,v[5000001],q[5000001],w[5000001];
long long sum;
void combheap(int i,int n);
void up(int fiu);
int extrage(int i);
int main()
{
fscanf(f,"%d%d",&n,&k);
for(i=1;i<=k;i++)
{
fscanf(f,"%d",&v[i]);
w[i]=i;
q[i]=i;
}
for(i=k/2;i>=1;i--)
combheap(i,k);
for(i=k+1;i<=n+1;i++)
sum=sum+extrage(i);
fprintf(g,"%lld",sum);
fclose(g);
return 0;
}
void combheap(int i,int n)
{
int a=v[i],tata=i,fiu=2*i;
while(fiu<=n)
{
if(fiu<n)
if(v[fiu]>v[fiu+1])fiu++;
if(a>v[fiu])
{
swap(v[tata],v[fiu]);
swap(q[tata],q[fiu]);
w[q[fiu]]=fiu;
w[q[tata]]=tata;
tata=fiu;
fiu=2*fiu;
} else fiu=n+1;
}
}
int extrage(int i)
{
int a=v[1];
int nr=i%k;
if(nr==0)nr=k;
v[w[nr]]=10000002;
combheap(w[nr],k);
fscanf(f,"%d",&v[w[nr]]);
up(w[nr]);
return a;
}
void up(int fiu)
{
int tata=fiu/2,a=v[fiu];
while(tata>=1)
{
if(a<v[tata])
{
swap(v[tata],v[fiu]);
swap(q[tata],q[fiu]);
w[q[fiu]]=fiu;
w[q[tata]]=tata;
fiu=tata;
tata/=2;
} else tata=-1;
}
}