Cod sursa(job #824493)

Utilizator RamaStanciu Mara Rama Data 26 noiembrie 2012 18:03:20
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <stdio.h>

using namespace std;
long long mx=0,H[5000001],v[5000001],poz[5000001],h=0,n;
void insert()
{
    long long k=h,aux;
    while(k>1 && H[k]<H[k/2])
    {
        aux=H[k];
        H[k]=H[k/2];
        H[k/2]=aux;

        v[mx]=k/2;
        v[poz[k/2]]=k;

        aux=poz[k/2];
        poz[k/2]=poz[k];
        poz[k]=aux;

        k=k/2;

    }
}
int minim()
{
    return H[1];
}
int pozminima(long long a,long long b)
{
    if(H[a]<H[b]) return a;
        else return b;
}
void down(long long x)
{
    long long aux,g,m;
    while(1)
    {


        if (2*x+1<=h){
            g=pozminima(2*x,2*x+1);
            m=H[g];
            if (H[g]<H[x]) {
                            aux=H[x];
                            H[x]=H[g];
                            H[g]=aux;

                            aux=v[poz[x]];
                            v[poz[x]]=v[poz[g]];
                            v[poz[g]]=aux;

                            aux=poz[x];
                            poz[x]=poz[g];
                            poz[g]=aux;


                        }
                    else break;
                      }
                else if(2*x<=h) {
                                    g=2*x;
                                    m=H[g];
                                    if(H[g]<H[x]) {
                                                        aux=H[x];
                                                        H[x]=H[g];
                                                        H[g]=aux;

                                                        aux=v[poz[x]];
                                                        v[poz[x]]=v[poz[g]];
                                                        v[poz[g]]=aux;

                                                        aux=poz[g];
                                                        poz[g]=poz[x];
                                                        poz[x]=aux;
                                                    }
                                                else break;
                                }
                        else break;

        x=g;
    }
}
void eliminare(long long  a)
{
    long long pozinheap=v[a];

    H[pozinheap]=H[h];
    h--;
    down(pozinheap);
}
int main()
{
    long long a,i,s=0,nr;
    FILE*f,*g;
    f=fopen("dqheap.in","r");
    g=fopen("dqheap.out","w");
    fscanf(f,"%lld%lld",&n,&nr);
    for(i=1;i<=n+1;i++)
    {
        fscanf(f,"%lld",&a);
        if(i>nr) eliminare(i-nr);
        H[++h]=a;
        v[++mx]=h;
        poz[h]=mx;
        insert();
        if(i>=nr) s=s+minim();
    }
    fprintf(g,"%lld",s);
    return 0;
}