Cod sursa(job #674091)

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

#define MAXN 5000001

int n, k;
int a[MAXN];
long long sum;
int heap[MAXN], pos[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 ];
	int k = pos[ node ];
	while( node > 1 && heap[ node / 2 ] > value )
	{
		heap[ node ] = heap[ node / 2 ];
		pos [ node ] = pos [ node / 2 ];
		node = node / 2;
	}
	heap[ node ] = value;
	pos [ node ] = k;
}

void push(int k)
{
	size++;
	heap[ size ] = a[ k ];
	pos [ 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 
			&& heap[ 2 * node ] > heap[ 2 * node + 1] )
				son = 2 * node + 1;
			if( heap[ son ] < heap[ node ] )
			{
				std::swap(heap[ son ], heap[ node ]);
				std::swap(pos [ son ], pos [ node ]);
				node = son;
			}
			else
				son = 0;
		}
	} while(son);	
}

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

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

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

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

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