Cod sursa(job #2081399)

Utilizator Tudor2PopescuPopescu Tudor-Cristian Tudor2Popescu Data 4 decembrie 2017 18:06:52
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
int h[5000003],v[5000003],k,n,i,nh;
long long s;
void urcare(int i)
{
    int aux;
    while(i>=2 && v[h[i/2]]>v[h[i]])
    {
        aux=h[i];
        h[i]=h[i/2];
        h[i/2]=aux;
        i=i/2;
    }
}
void coborare(int i,int nh)
{
    int r,aux;
    while(2*i<=nh)
    {
        r=2*i;
        if(r+1<=nh && v[h[r]]>v[h[r+1]])
        {
            r=r+1;
        }
        if(v[h[i]]>v[h[r]])
        {
            aux=h[i];
            h[i]=h[r];
            h[r]=aux;
            i=r;
        }
        else
        {
            break;
        }
    }
}
int main()
{
    fin>>n>>k;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    nh=0;
    for(i=1;i<=k;i++)
    {
        nh++;
        h[nh]=i;
        urcare(nh);
    }
    s=0;
    for(i=1;i<=n-(k-1);i++)
    {
        while(h[1]<i)
        {
            h[1]=h[nh];
            nh--;
            coborare(1,nh);
        }
        s=s+v[h[1]];
        nh++;
        h[nh]=i+k;
        urcare(nh);
    }
    fout<<s;
    fin.close();
    fout.close();
    return 0;
}