Cod sursa(job #1028650)

Utilizator lehman97Dimulescu David lehman97 Data 14 noiembrie 2013 15:29:17
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#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)*1LL;
    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;
    }
}