Cod sursa(job #739394)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 22 aprilie 2012 21:58:16
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <fstream>
#define LE 6050050
#define inf  50000000
#define ll long long
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int dreapta,stanga,poz[LE],V[LE],N,i,n,k,okz,H[LE],C;
ll suma;
int UP(int D)

{
  while (D>1&&V[H[D/2]]>V[H[D]])
    {
      poz[H[D]]=D/2;
      poz[H[D/2]]=D;
      swap(H[D],H[D/2]);
      D/=2;
    }
}

int DOWN(int D)
{
    if (D*2<=N){
  do
    {
      okz=0;
      if( V[H[D*2]]<V[H[D]]  ||  V[H[D*2+1]]<V[H[D]] )
        {
          okz=1;
          C=2*D;

          if (D*2<N&&V[H[C]]>V[H[D*2+1]])
            C=2*D+1;
          poz[H[D]]=C;
          poz[H[C]]=D;
          swap(H[D],H[C]);

          D=C;
        }
    }
  while(okz&&D<=N/2);
    }
}

int adaug(int Vpoz)
{
  H[++N]=Vpoz;
  poz[Vpoz]=N;
  UP(N);
}

int sterg(int Vpoz)
{
  int Hpoz=poz[Vpoz];

  swap(H[Hpoz],H[N]);
  H[N--]=0;
  poz[H[Hpoz]]=Hpoz;

  UP(Hpoz);
  DOWN(Hpoz);
}

int main()
{


  f>>n>>k;
  for(i=1; i<=n; ++i)
    f>>V[i];
  V[0]=inf;

  for(i=1; i<=n; ++i)
    {
      if (i>k)
        sterg(i-k);

      adaug(i);

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

    }
  g<<suma<<'\n';
  f.close();
  g.close();
  return 0;
}