Cod sursa(job #828850)

Utilizator matei_cChristescu Matei matei_c Data 4 decembrie 2012 15:50:41
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

#define maxn 5000001

int n, k ;
int v[maxn] ;
int heap[maxn] ;
int poz[maxn] ;
bool sters[maxn] ;
int nrheap ;

void schimba(int a,int b)
{
	swap ( heap[a] , heap[b] ) ;
	poz[ heap[a] ] = a ;
	poz[ heap[b] ] = b ;
}


void urca(int unde)
{
	while( unde > 1 && v[ heap[unde] ] < v[ heap[ unde / 2 ] ] )
	{
		schimba( unde, unde / 2 ) ;
		unde /= 2 ;
	}
}

void coboara(int unde)
{
	int fiust = 2 * unde ;
	int fiudr = 2 * unde + 1 ;
	int ajunge = unde ;
 
	if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[ajunge] ] )
		ajunge = fiust ;
 
	if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[ajunge] ] )
		ajunge = fiudr ;
 
	if( unde != ajunge )
	{
		schimba( unde, ajunge ) ;
		coboara( ajunge ) ;
	}

}

int main()
{
	
	freopen("deque.in", "r", stdin);
	freopen("deque.out", "w", stdout);
	
	scanf("%d%d", &n, &k);
	
	for(int i = 1; i <= n; ++i )
		scanf("%d", &v[i]);
	
	for(int i = 1; i <= k; ++i)
	{	
		heap[++nrheap] = i ;
		poz[i] = nrheap ;
		urca( nrheap ) ;
	}	
	
	long long rez = 0 ;
	
	for(int i = k + 1; i <= n; ++i )
	{
		rez += v[ heap[1] ] ;
		
		heap[++nrheap] = i ;
		poz[i] = nrheap ;
		urca( nrheap ) ;
		
		sters[ i - k ] = true ;
		
		while( sters[ heap[1] ] == true )
		{
			heap[1] = heap[nrheap] ;
			poz[ heap[nrheap] ] = 1 ;
			coboara( 1 ) ;
		}
		
	}	
	
	rez += v[ heap[1] ] ;
	
	printf("%lld\n", rez);
	
	return 0;
	
}