Cod sursa(job #1923464)

Utilizator duesakBourceanu Cristian duesak Data 11 martie 2017 02:58:34
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
int hp[5000001];
int poz[5000001];
int vl[5000001];
int lhp=0;
void hpup(int el,int indx){
    int aux;
    while(indx>>1>0&&vl[el]<vl[hp[indx>>1]]){
        aux=el;
        hp[indx]=hp[indx>>1];
        hp[indx>>1]=aux;
        poz[hp[indx>>1]]=indx>>1;
        poz[hp[indx]]=indx;
        indx>>=1;
    }
}
void hpdown(int el,int indx){
    int aux;
    while(1){
        if(indx<<1<=lhp&&vl[el]>vl[hp[indx<<1]]&&((indx<<1)+1>lhp||vl[hp[indx<<1]]<=vl[hp[1+(indx<<1)]])){
            aux=el;
            hp[indx]=hp[indx<<1];
            hp[indx<<1]=el;
            poz[hp[indx]]=indx;
            poz[hp[indx<<1]]=indx<<1;
            indx<<=1;
        }
        else if(1+(indx<<1)<=lhp&&vl[el]>vl[hp[1+(indx<<1)]]&&vl[hp[1+(indx<<1)]]<=vl[hp[indx<<1]]){
            aux=el;
            hp[indx]=hp[1+(indx<<1)];
            hp[1+(indx<<1)]=el;
            poz[hp[indx]]=indx;
            poz[hp[1+(indx<<1)]]=1+(indx<<1);
            indx<<=1;
            indx++;
        }
        else break;
    }
}
void inserthp(int el,int indx){
    if(!hp[indx]){hp[indx]=el;poz[el]=indx;}
    if(indx>>1>0&&vl[el]<vl[hp[indx>>1]])hpup(el,indx);
    else hpdown(el,indx);
}
int main(){
    int n,k,i,j,s=0,el,indx;
    fin>>n>>k;
    for(i=1;i<=k;i++){
        fin>>el;
        vl[i]=el;
        inserthp(i,++lhp);
    }
    s+=vl[hp[1]];
    j=k;
    while(j<n){
        fin>>el;
        ++j;
        indx=j%k;
        if(!indx)indx=k;
        vl[indx]=el;
        inserthp(indx,poz[indx]);
        s+=vl[hp[1]];
    }
    fout<<s<<'\n';
    fin.close();
    fout.close();
}