Cod sursa(job #1052781)

Utilizator Dayanna000Amegica Dayanna Dayanna000 Data 11 decembrie 2013 19:47:47
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
using namespace std;
long long a[5000001];
int n,ind[5000001],k,nr;
void adaug(long long poz)
  {
      long long aux;
      while(poz>1 && a[ind[poz/2]]>a[ind[poz]])
        {
            swap(ind[poz],ind[poz/2]);
            poz=poz/2;
        }
  }
void sj(long long poz)
  {
      long long st,dr,mini,aux;
      mini=poz;
      st=2*poz;
      dr=2*poz+1;
      if(st<=nr && dr<=nr)
        {
            if(a[ind[st]]<a[ind[dr]])
               mini=st;
               else
               mini=dr;
            if(a[ind[mini]]<a[ind[poz]])
               {
                   swap(ind[mini],ind[poz]);
                   sj(mini);
               }
        }
        else
      {
          if(st<=nr && a[ind[st]]<a[ind[poz]])
            mini=st;
            else
          if(dr<=nr && a[ind[dr]]<a[ind[poz]])
            mini=dr;
          if(mini!=poz)
           {
            swap(ind[mini],ind[poz]);
            sj(mini);
           }
      }
  }
int main()
{
    ifstream f("deque.in");
    ofstream g("deque.out");
    long long s;
    int i;
    f>>n>>k>>a[1];
    ind[1]=1;
    for(i=2;i<=k;++i)
       {
           f>>a[i];
           ind[i]=i;
           adaug(i);
       }
    s=a[ind[1]];
    nr=k;
    for(i=k+1;i<=n;++i)
      {
          f>>a[i];
          while(i-ind[1]+1>k)
            {
                ind[1]=ind[nr];
                nr--;
                sj(1);
            }
          nr++;
          ind[nr]=i;
          adaug(nr);
          s=s+a[ind[1]];
      }
    g<<s;
    f.close();
    g.close();
    return 0;
}