Cod sursa(job #674093)

Utilizator damgoodLincan Dan damgood Data 5 februarie 2012 15:46:24
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>

#define MAXN 5000001

int n, k;
int a[MAXN];
long long sum;
int heap[MAXN], size;

void read()
{
	freopen("deque.in", "r", stdin);
	freopen("deque.out", "w", stdout);

	scanf("%d %d ", &n, &k);	
	for(int i = 1; i <= n; ++i)
	{
		scanf("%d ", a + i);
	}
}

void percolate(int node)
{
	int value = heap[ node ];
	
	while( node > 1 && a[ heap[ node / 2 ] ] > a[ value ] )
	{
		heap[ node ] = heap[ node / 2 ];
		node = node / 2;
	}
	heap[ node ] = value;
}

void push(int k)
{
	size++;
	heap[ size ] = k;
	percolate(size);
}

void sift(int node)
{
	int son;
	do 
	{
		son = 0;
		if( 2 * node <= size )
		{
			son = 2 * node;
			if( 2 * node + 1 <= size 
			&& a[ heap[ 2 * node ] ] > a[ heap[ 2 * node + 1] ] )
				son = 2 * node + 1;
			if( a[ heap[ son ] ] < a[ heap[ node ] ] )
			{
				std::swap(heap[ son ], heap[ node ]);
				node = son;
			}
			else
				son = 0;
		}
	} while(son);	
}

void pop(int node)
{
	heap[ node ] = heap[ size ];
	size--;

	if( (node > 1) && (a[ heap[ node ] ] < a[ heap[ node / 2 ] ]) )
		percolate( node );
	else
		sift( node );
}

void solve()
{
	for(int i = 1; i <= n; ++i)
	{
		push(i);
		if( i >= k )
		{
			while( heap[1] <= i - k ) pop(1);
			sum += a[ heap[ 1 ] ] ;
		}
	} 
}

void printResult()
{
	printf("%lld\n", sum);
}

int main()
{
	read();
	solve();
	printResult();
	return 0;
}