Cod sursa(job #1068536)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 28 decembrie 2013 14:14:53
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<algorithm>

using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct dub{
    int b,a;
};

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

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