Cod sursa(job #1051330)

Utilizator mads2194FMI - Andrei Stroe mads2194 Data 9 decembrie 2013 22:16:05
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <deque>

#define N 5000000

using namespace std;

struct elem
{
    int val;
    int ord;
};

elem heap[N];
int n;

void swap(elem &a,elem &b)
{
    elem t;
    t=a;
    a=b;
    b=t;
}

void urca(int pos)
{
    while(pos>1 && heap[pos].val<heap[pos/2].val)
    {
        swap(heap[pos],heap[pos/2]);
        pos/=2;
    }
}

void coboara(int pos)
{
    while( pos*2+1<=n && ( heap[pos].val>heap[pos*2].val || heap[pos].val>heap[pos*2+1].val ) )
    {
        int p=pos*2;

        if(heap[p+1].val<heap[p].val)
            ++p;
        swap(heap[pos],heap[p]);
        pos=p;
    }
    if(pos*2==n && heap[pos].val>heap[pos*2].val)
        swap(heap[pos],heap[pos*2]);
}

void adaug(int v,int o)
{
    elem e;
    e.val = v;
    e.ord = o;
    heap[++n]=e;
    urca(n);
}

void elimin(int pos)
{
    heap[pos]=heap[n--];
    //urca(pos);
    coboara(pos);
}

int main()
{

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

    int m,k;
    scanf("%d %d",&m,&k);

    long long int s=0;

    for(int i=0;i<m;++i)
    {
        int x;
        scanf("%d",&x);

        while(n>0 && (i - heap[1].ord>=k)) elimin(1);
        while(n>0 && (heap[1].val>=x))
            elimin(1);
        adaug(x,i);
        if(i>=k-1)
        {
            //while(n>0 && (i - heap[1].ord==k)) elimin(1);
            s+=heap[1].val;
        }
    }

    printf("%lld\n",s);
    return 0;
}