Cod sursa(job #1068516)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 28 decembrie 2013 14:00:38
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
#include<algorithm>
#define minini -10000001
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct dub{
    int val,poz;
};

int n,k,v[5000001],i,j,nr,h,loc;
dub heap[5000001];
long long sum;

int minim(int a,int b)
{
    if(heap[a].val<heap[b].val)
        return a;
    return b;
}
int main()
{
    f>>n>>k;
    heap[0].val=minini;
    for(i=1;i<=k;i++)
    {
        f>>v[i];
        heap[i].val=v[i];
        heap[i].poz=i;
        j=i;
        while(heap[j].val<heap[j/2].val)
        {
            swap(heap[j],heap[j/2]);
            j/=2;
        }
    }
    sum+=heap[1].val;
    nr=k;
    for(i=k+1;i<=n;i++)
    {
        nr++;
        f>>v[i];
        heap[nr].val=v[i];heap[nr].poz=i;
        j=nr;
        while(heap[j].val<heap[j/2].val)
        {
            swap(heap[j],heap[j/2]);
            j/=2;
        }
        while(!(heap[1].poz>=i-k+1&&heap[1].poz<=i))
        {
            swap(heap[1],heap[nr]);
            nr--;
            h=1;
            while(2*h+1<=nr)
            {
                loc=minim(2*h,2*h+1);
                if(!(heap[h].val>heap[loc].val))
                    break;
                swap(heap[h],heap[loc]);
                h=loc;
            }
            if(2*h+1>nr)
                if(2*h==nr)
                    if(heap[h].val>heap[2*h].val)
                        swap(heap[h],heap[2*h]);
        }
        sum+=heap[1].val;
    }
    g<<sum;
    f.close();g.close();
    return 0;
}