Cod sursa(job #855066)

Utilizator RamaStanciu Mara Rama Data 14 ianuarie 2013 16:48:29
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <stdio.h>

using namespace std;
long h=0,n,k,v[5000001],H[5000001];
long long s=0;
int minim()
{
//    printf("%ld",H[1]);
    return H[1];
}
void insert()
{
    long  k,aux;
    k=h;
    while(k>1 && H[k]<H[k/2])
    {
        aux=H[k];
        H[k]=H[k/2];
        H[k/2]=aux;

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

        k=k/2;
    }
}
int pozminima(long a, long b)
{
    if(H[a]<H[b]) return a;
        else return b;
}
void down(long x)
{
    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[x];
                            v[x]=v[g];
                            v[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[x];
                                                        v[x]=v[g];
                                                        v[g]=aux;
                                                    }
                                                else break;
                                }
                        else break;

        x=g;
    }
}
void eliminare( long a)
{

    while (v[1]<a)
                        {
                            H[1]=H[h];
                            h--;
                            down(1);
                        }

}

int main()
{
    long i;
    FILE*f,*g;
    f=fopen("deque.in","r");
    g=fopen("deque.out","w");
    fscanf(f,"%ld%ld",&n,&k);
    for(i=1;i<k;i++)
    {
        ++h;
        fscanf(f,"%ld",&H[h]);
//        printf("*%d*\n",H[h]);
        v[h]=i;
        insert();
    }
    for(i=k;i<=n;i++)
    {
        ++h;
        fscanf(f,"%ld",&H[h]);
//        printf("*%d*\n",H[h]);
        v[h]=i;
        insert();
        eliminare(i-k+1);
        s=s+minim();

    }
    fprintf(g,"%lld",s);
    return 0;
}