Cod sursa(job #1050872)

Utilizator vlad.florescu94FMI Florescu Vlad - Adrian vlad.florescu94 Data 9 decembrie 2013 11:51:34
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream>
#include<algorithm>
#define minini -10000001
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct dub{
int val,poz;
};

int n,k,v[5000001],i,j,nr,h,loc;
dub heap[5000001];
long long sum;

int minim(int a,int b)
{
    if(heap[a].val<heap[b].val)
        return a;
    return b;
}
int main()
{
    f>>n>>k;
    heap[0].val=minini;
    for(i=1;i<=k;i++)
      {
          f>>v[i];
          heap[i].val=v[i];
          heap[i].poz=i;
          j=i;
          while(heap[j].val<heap[j/2].val)
            {
              swap(heap[j],heap[j/2]);
              j/=2;
            }
      }
    sum+=heap[1].val;
    nr=k;
    for(i=k+1;i<=n;i++)
      {
         nr++;
         f>>v[i];
         heap[nr].val=v[i];heap[nr].poz=i;
         j=nr;
          while(heap[j].val<heap[j/2].val)
            {
              swap(heap[j],heap[j/2]);
              j/=2;
            }
        while(!(heap[1].poz>=i-2&&heap[1].poz<=i))
            {
                swap(heap[1],heap[nr]);
                nr--;
                h=1;loc=minim(2*h,2*h+1);
                  while(heap[h].val>heap[loc].val&&2*h+1<=nr)
                    {
                      swap(heap[h],heap[loc]);
                      h=loc;loc=minim(2*h,2*h+1);
                    }
                if(2*h+1>nr)
                    if(2*h==nr)
                      if(heap[h].val>heap[2*h].val)
                        swap(heap[h],heap[2*h]);
            }
       sum+=heap[1].val;
      }
   g<<sum;
   f.close();g.close();
   return 0;
}