Cod sursa(job #1053603)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 12 decembrie 2013 20:47:24
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<iostream>
#define dim 5000003

using namespace std;
 
int pos[dim],h[dim],N,a[dim];

inline int rs(int nod){
    return 2*nod+1;
}
inline int ls(int nod){
    return 2*nod;
}
void urca(int k){
 
    while( k>1 && a[h[k>>1]]>a[h[k]]){
        swap(pos[h[k]],pos[h[k>>1]]);
        swap(h[k],h[k>>1]);
        k>>=1;
    }
}
void coboara( int nod){
 
    int fiu=nod;
 
 
 
    if(ls(nod)<=N && a[h[fiu]]>a[h[ls(nod)]] ){
        fiu=ls(nod);
 
    }
    if(rs(nod)<=N && a[h[fiu]]>a[h[rs(nod)]]){
        fiu=rs(nod);
    }
    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;
	long long sum=0;
	freopen("deque.in","r",stdin);
	freopen("deque.out","w",stdout);
    scanf("%d%d",&n,&k);
    
	for(int i=1;i<k;++i){
		
		scanf("%d",&a[i]);
		insert(i);
		
	}
	for(int i=k;i<=n;++i){
		scanf("%d",&a[i]);
		insert(i);
		while(h[1]<i-k+1)
			erase(1);
		sum+=a[h[1]];
	}
	printf("%lld",sum);
    return 0;
}