Cod sursa(job #1519838)

Utilizator jimcarterJim Carter jimcarter Data 7 noiembrie 2015 21:58:23
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <cstdio>
using namespace std;

FILE *f = fopen ( "deque.in" , "r" ) , *g = fopen ( "deque.out" , "w" );

const int MAXK = 5000005 , MAXN = 5000005;
int N , K , i , father , index , son , heap [ MAXK ] , value [ MAXN ] , indexed [ MAXN ] , aux , left , right;
long long SUM;

void heapify ( int index )
{
    father = index / 2;
    while ( value [ heap [ index ] ] < value [ heap [ father ] ] && father )
    {
        aux = heap [ index ] , heap [ index ] = heap [ father ] , heap [ father ] = aux;
        indexed [ heap [ index ] ] = index;
        indexed [ heap [ father ] ] = father;
        index /= 2 , father = index / 2;
    }
}

void shiftdown ( int index )
{
    //find the minimum
    son = -1;
    while ( index != son )
    {
        left = index * 2 , right = left + 1;
        son = index;
        if ( left <= K && value [ heap [ left ] ] < value [ heap [ index ] ] )
            index = left;
        if ( right <= K && value [ heap [ right ] ] < value [ heap [ index ] ] )
            index = right;

        aux = heap [ index ] , heap [ index ] = heap [ son ] , heap [ son ] = aux;
        indexed [ heap [ index ] ] = index;
        indexed [ heap [ son ] ] = son;
    }
}

void eliminate ( int index )
{
    heap [ index ] = heap [ K ] , K --;
    shiftdown ( index );
}

void addToHeap ( int i , int index )
{
    eliminate ( indexed [ index ] ); //eliminate the node at position index
    K ++ , heap [ K ] = i , heapify ( K ); //add number in the heap
}

void addToSum()
{
    SUM += value [ heap [ 1 ] ];
}

void build_heap()
{
    for ( i = K / 2 ; i > 0 ; i -- )
        shiftdown ( i );
}

void read()
{
    fscanf ( f , "%d %d" , &N , &K );
    for ( i = 1 ; i <= K ; indexed [ i ] = i , heap [ i ] = i , i ++ )
        fscanf ( f , "%d" , &value [ i ] );
    build_heap();
    addToSum(); //add minim to sum
    for ( i = K + 1 ; i <= N ; i ++ )
    {
        indexed [ i ] = i;
        fscanf ( f , "%d" , &value [ i ] );
        addToHeap ( i , i - K );
        addToSum();
    }
}

void print()
{
    fprintf ( g , "%lld\n" , SUM );
}

int main()
{
    read();
    print();
    return 0;
}