Cod sursa(job #1023417)

Utilizator radu2004GOLD radu radu2004 Data 6 noiembrie 2013 21:58:37
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>

using namespace std;
FILE *f,*g;
int n,k,a[5000003],pos[5000003],h[5000005],i;
long long s;
void swap (int i,int j)
{
    int aux=h[i];
    h[i]=h[j];
    h[j]=aux;
    pos[h[i]]=i;
    pos[h[j]]=j;

}
void dw (int k,int n)
{
    int st=k*2;
    if (st<=n)
    {
        if (a[h[st]]>a[h[st+1]] && st+1<=n) st++;
        if (a[h[k]]>a[h[st]])
        {
            swap (st,k);
            dw (st,n);
        }
    }

}
void up (int k)
{
    int t=k/2;
    if (t>0)
        if (a[h[t]]>a[h[k]])
    {
        swap (t,k);
        up (t);
    }
}
int main()
{f=fopen ("deque.in","r");
 g=fopen ("deque.out","w");
 fscanf (f,"%d%d",&n,&k);
 for (i=1;i<=k;i++)
 {
     fscanf (f,"%d",&a[i]);
     pos[i]=i;
     h[i]=i;
 }
 for (i=k/2;i>=1;i--) dw (i,k);

 s+=a[h[1]];
 for (i=k+1;i<=n;i++)
 {
     fscanf (f,"%d",&a[i]);
     pos[i]=pos[i-k];
     h[pos[i]]=i;
     up (pos[i]);
     dw (pos[i],k);
     s+=a[h[1]];
 }

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