Cod sursa(job #1863134)

Utilizator IordachescuAncaFMI Iordachescu Anca Mihaela IordachescuAnca Data 30 ianuarie 2017 18:47:26
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
struct pereche
{
    int val, poz;
};
pereche heap[5000002];
int n,x,i,nh,k;
long long s;
void urcare(pereche heap[],int p)
{
    pereche aux;
    while(p>=2&&heap[p/2].val>heap[p].val)
    {
        aux=heap[p/2];
        heap[p/2]=heap[p];
        heap[p]=aux;
        p=p/2;
    }
}
void coborare(pereche heap[],int nh, int p)
{
    pereche aux;
    int r;
    while(2*p<=nh)
    {
        r=2*p;
        if(r+1<=nh&&heap[r+1].val<heap[r].val)
        {
            r++;
        }
        if(heap[r].val<heap[p].val)
        {
            aux=heap[r];
            heap[r]=heap[p];
            heap[p]=aux;
            p=r;
        }
        else
        {
            break;
        }
    }
}
int main()
{
    fin>>n>>k;
    s=0;
    for(i=1;i<=k;i++)
    {
        fin>>x;
        heap[i].val=x;
        heap[i].poz=i;
        urcare(heap,i);
    }
    s=s+heap[1].val;
    nh=k;
    for(i=k+1;i<=n;i++)
    {
        fin>>x;
        nh++;
        heap[nh].val=x;
        heap[nh].poz=i;
        urcare(heap,nh);
        while(heap[1].poz<=i-k)
        {
            heap[1]=heap[nh];
            nh--;
            coborare(heap,nh,1);
        }
        s=s+heap[1].val;
    }
    fout<<s;
    fin.close();
    fout.close();
    return 0;
}