Cod sursa(job #739361)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 22 aprilie 2012 20:36:33
Problema Deque Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <fstream>
#define LE 5000005
#define inf 5000000
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct two
{
  int val,poz;
} H[LE];
int dreapta,stanga,el[LE],l[LE],N,i,n,k,suma;

void up(int X)
{
  while (X!=1&&H[X].val<H[X/2].val)
    {
      swap(el[H[X].poz],el[H[X/2].poz]);
      swap(H[X],H[X/2]);
      X=X/2;
    }
}

void down(int X)
{
  int okz;
  if (X*2<=N)
  do
    {
      stanga=H[X*2].val;
      okz=0;

      if (X*2==N) dreapta=inf;
      else dreapta=H[X*2+1].val;


      if (H[X].val>stanga||H[X].val>dreapta)
        {
          okz=1;
          if (stanga<dreapta)
            {
              swap(el[H[X].poz],el[H[X*2].poz]);
              swap(H[X],H[X*2]);
            }
          else
            {
              swap(el[H[X].poz],el[H[X*2+1].poz]);
              swap(H[X],H[X*2+1]);
            }
        }
    }
  while (X*2<=N&&okz);
}


void adaug()
{
  H[++N].poz=i;
  el[i]=N;
  H[N].val=l[i];
  up(N);
}

int sterg(int X)
{
  swap(H[X],H[N]);
  el[H[X].poz]=X;
  N--;

  if (X>1&&H[X].val<H[X/2].val) up(X);
  else
    down(X);
}
int main()
{
  freopen("deque.in","r",stdin);
  freopen("deque.out","w",stdout);

  scanf("%ld%ld",&n,&k);

  for(i=1; i<=n; ++i)
    scanf ("%ld",&l[i]);

  for(i=1; i<=n; ++i)
    {
      adaug();

      if (i>k)
        sterg(el[i-k]);

      if (i>=k)
        suma+=H[1].val;

    }
printf("%ld\n",suma);
  f.close();
  g.close();
  return 0;
}