Cod sursa(job #633622)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 14 noiembrie 2011 11:28:34
Problema Deque Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 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],alCateleaAFostInserat,lungimeHeap;
int n,kk,a[MAX_N],minim=0;

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

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

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

void stergere(int k)
{
	heap[k]=heap[lungimeHeap];
	p[a[heap[k]]] = k;
	lungimeHeap--;
	if(k>1 && a[heap[k]]<a[heap[k/2]])
		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()
{
	//for(int i=1;i<=n;i++)
		//printf("%d ",a[i]);
	printf("%d\n",minim);
}

void rezolvare()
{
	for(int i=1;i<=kk;i++)
		inserare(i);
	//printf("%d ",a[heap[1]]);
	minim += a[heap[1]];
	//for(int j=1;j<=lungimeHeap;j++)
		//printf("%d ",heap[j]);
	//printf("\n");
	for(int i=1;i<=n-kk;i++)
	{
		stergere(p[a[i]]);
		inserare(i+kk);
		//printf("%d ",a[heap[1]]);
		minim+=a[heap[1]];
		//for(int j=1;j<=lungimeHeap;j++)
			//printf("%d ",heap[j]);
		//printf("\n");
	}
	//printf("\n");	
}

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