Cod sursa(job #633632)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 14 noiembrie 2011 12:05:40
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_N = 5000005;
const int MAX_HEAP_SIZE = 8388610;

int  heap[MAX_N],p[MAX_N],lungimeHeap;
int n,kk;
int a[MAX_N];
long long minim=0;

void coboaraInHeap(int k)
{
	int fiu;
	do
	{
		fiu = 0;
		if(k<<1 <= lungimeHeap)
		{
			fiu = k<<1;
			if(fiu+1 <= lungimeHeap && a[heap[fiu+1]]<a[heap[fiu]])
				fiu++;
		}
		if(a[heap[fiu]] >= a[heap[k]])
			fiu = 0;
		if(fiu)
		{
			int aux=heap[fiu];
			heap[fiu]=heap[k];
			heap[k]=aux;
			p[heap[k]]=k;
			p[heap[fiu]]=fiu;
			k = fiu;
		}
	}while(fiu);
}

void urcaInHeap(int k)
{
	int val = heap[k];
	while(k>1 && a[val]<a[heap[k>>1]])
	{
		heap[k]=heap[k>>1];
		p[heap[k]]=k;
		k>>=1;
	}
	heap[k]=val;
	p[heap[k]] = k;
}

void inserare(long long pozInA)
{
	lungimeHeap++;
	heap[lungimeHeap]= pozInA;
	p[heap[lungimeHeap]] = lungimeHeap;
	urcaInHeap(lungimeHeap);
}

void stergere(long long k)
{
	heap[k]=heap[lungimeHeap];
	p[heap[k]] = k;
	lungimeHeap--;
	if(k>1 && a[heap[k]]<a[heap[k>>1]])
		urcaInHeap(k);
	else 
		coboaraInHeap(k);
}

void citire()
{
	scanf("%d %d",&n,&kk);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
}

void afisare()
{
	printf("%lld\n",minim);
}

void rezolvare()
{
	for(int i=1;i<=kk;++i)
		inserare(i);
	minim += a[heap[1]];
	for(int i=1;i<=n-kk;++i)
	{
		stergere(p[i]);
		inserare(i+kk);
		minim+=(long long)a[heap[1]];
	}
}

int main()
{
	freopen("deque.in","rt",stdin);
	freopen("deque.out","wt",stdout);
	citire();
	rezolvare();
	afisare();
	return 0;
}