Cod sursa(job #1088145)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 20 ianuarie 2014 11:08:31
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>

using namespace std;


int heap[5000100];
int vtoheap[5000100];
int heaptov[5000100];

int nrheap;


void hswap( int poz1, int poz2 )
{
    int t;

    t = heap[poz1];
    heap[poz1] = heap[poz2];
    heap[poz2] = t;

    vtoheap[heaptov[poz1]] = poz2;
    vtoheap[heaptov[poz2]] = poz1;

    t = heaptov[poz1];
    heaptov[poz1] = heaptov[poz2];
    heaptov[poz2] = t;
}

void upheap( int poz )
{
    if ( poz == 1 )
        return;

    if ( heap[poz] < heap[poz/2] )
    {
        hswap( poz, poz/2 );
    }
}

void downheap( int poz )
{
    if ( ( heap[poz] > heap[poz*2] ) && ( poz * 2 <= nrheap ) )
    {
        if ( ( heap[poz*2] > heap[poz*2+1] ) && ( poz * 2 + 1 <= nrheap ) )
        {
            hswap( poz, poz*2+1 );
        }
        else
        {
            hswap( poz, poz*2 );
        }
    }
    else
    {
        if ( ( heap[poz] > heap[poz*2+1] ) && ( poz * 2 + 1 <= nrheap ) )
        {
            hswap( poz, poz*2+1 );
        }
    }
}

void add( int x, int vpoz )
{
    heap[++nrheap] = x;
    heaptov[nrheap] = vpoz;
    vtoheap[vpoz] = nrheap;

    upheap( nrheap );
}

void hreplace( int poz, int x, int vpoz )
{
    heap[poz] = x;
    heaptov[poz] = vpoz;
    vtoheap[vpoz] = poz;

    if ( heap[poz] < heap[poz/2] )
    {
        upheap( poz );
    }
    else
    {
        downheap( poz );
    }
}

int main()
{
    freopen( "deque.in", "r", stdin );
    freopen( "deque.out", "w", stdout );

    int n, k, i;
    int dummy;
    long long s = 0;

    scanf( "%d %d\n", &n, &k );

    for ( i = 1; i <= k; ++i )
    {
        scanf( "%d\n", &dummy );

        add( dummy, i );
    }


    for ( i = k + 1; i <= n ; ++i )
    {
        scanf( "%d\n", &dummy );

        s += heap[1];

        hreplace( vtoheap[i-k], dummy, i );
    }
    s += heap[1];


    printf( "%I64d\n", s );


    fclose( stdin );
    fclose( stdout );

    return 0;
}