Cod sursa(job #1197005)

Utilizator azkabancont-vechi azkaban Data 10 iunie 2014 11:27:04
Problema Deque Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("deque.in");
ofstream cout("deque.out");

void ridica(int nod,int H[],int poz[])
{
  if (nod>1 && H[nod]<=H[nod/2]) {
                                   swap(poz[nod],poz[nod/2]);
                                   swap(H[nod],H[nod/2]);
                                   ridica(nod/2,H,poz);
                                 }   
}

void adauga(int nod,int &n,int H[],int poz[])
{
  n+=1;
  H[n]=nod;
  poz[n]=n;
  ridica(n,H,poz);
}

void coboara(int nod,int n,int H[],int poz[])
{
  int fiu;
  if (fiu!=0) {
                  fiu=0;
                  if (nod*2<=n ){ 
                                  fiu=nod*2;
                        if (nod*2<n && H[nod *2+1]<H[nod*2]) fiu=nod*2+1;
                     if (H[fiu]>=H[nod]) fiu=0;}
                     if (fiu!=0) {
                                  swap(poz[nod],poz[fiu]);
                                  swap(H[nod],H[fiu]);
                                  coboara(fiu,n,H,poz);
                                 }
                  }
}

void sterge(int nod, int &n,int H[],int poz[])
{
  swap(poz[1],poz[n]);
  swap(H[1],H[n]);
  n-=1;
  coboara(1,n,H,poz);   
}

void verifica(int nod,int n,int H[],int poz[],int left)
{
  if (poz[nod]<left) {
                       sterge(1,n,H,poz);
                       verifica(1,n,H,poz,left);
                      } 
     
}

int n,k,aux,t,H[5000005],poz[5000005];

int main()
{ 
  int left=0,suma=0;
  cin>>t>>k;
  for (int i=1;i<=t;i++){
                         cin>>aux;
                         adauga(aux,n,H,poz);
                         if (i>=k) 
                             if (i<=t) { 
                                        verifica(1,n,H,poz,left+1);
                                        left=i-k+1;
                                        suma+=H[1];
                                       }
                         }
  cout<<suma;
  return 0;
}