Cod sursa(job #1088272)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 20 ianuarie 2014 13:38:30
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 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 )
{
    while ( heap[poz] < heap[poz/2] )
    {
        hswap( poz, poz/2 );
        poz /= 2;
    }
}

void downheap( int poz )
{
    bool ok = 1;
    while ( ok )
    {
        ok = 0;
        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 );
                poz = poz*2+1;
                ok = 1;
            }
            else
            {
                hswap( poz, poz*2 );
                poz = poz*2;
                ok = 1;
            }
        }
        else
        {
            if ( ( heap[poz] > heap[poz*2+1] ) && ( poz * 2 + 1 <= nrheap ) )
            {
                hswap( poz, poz*2+1 );
                poz = poz*2+1;
                ok = 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 );

    heap[0] = -10000100;

    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( "%lld\n", s );


    fclose( stdin );
    fclose( stdout );

    return 0;
}