Cod sursa(job #1053756)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 12 decembrie 2013 22:32:44
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<fstream>
#define dim 5000050
  
using namespace std;
   
ifstream f("deque.in");
ofstream g("deque.out");
int pos[2*dim],h[2*dim],N,a[dim];
long long sum;
 
void urca(int k){
   
    while( k>1 && a[h[k/2]]>a[h[k]]){
        swap(pos[h[k]],pos[h[k/2]]);
        swap(h[k],h[k/2]);
        k/=2;
    }
}
void coboara( int nod){
   
    int fiu=nod;
    int rs=2*nod+1;
    int ls=2*nod;
    if(ls<=N && a[h[fiu]]>a[h[ls]] ){
        fiu=ls;
   
    }
    if(rs<=N && a[h[fiu]]>a[h[rs]]){
        fiu=rs;
    }
    if(nod!=fiu){
        swap(pos[h[nod]],pos[h[fiu]]);
        swap(h[fiu],h[nod]);
        coboara(fiu);
    }
}
void insert(    int X   ){
    h[++N]=X;
    pos[X]=N;
    urca(pos[X]);
}
   
void erase( int X ){
      
    swap(pos[h[X]],pos[h[N]]);
    swap(h[X],h[N]);
    --N;
    coboara(X);
      
}
int main () {
 int k,n;
    f>>n>>k;
    for(int i=1;i<k;++i){
          
        f>>a[i];
        insert(i);
          
    }
    for(int i=k;i<=n;++i){
        f>>a[i];
        
        if(a[i]<=a[h[1]]) {
            h[1]=i;
            pos[1]=i;
            urca(N);
        }
        else
            insert(i);
        while(h[1]<i-k+1)
            erase(1);
        sum+=a[h[1]];
    }
    g<<sum<<"\n";
    return 0;
}