Cod sursa(job #825217)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 27 noiembrie 2012 21:12:34
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include<fstream>

using namespace std;

ifstream f("deque.in");
ofstream g("deque.out");

typedef struct { long long val; long long, poz; } str;

str heap[5000001];

long long n, i, k, s=0, x;

long long father(long long x)
{
	return x/2;
}

long long left_son(long long x)
{
	return x*2;
}

long long right_son(long long x)
{
	return x*2+1;
}

long long maxim(str heap[])
{
	return heap[1].val;
}

long long max(str heap[], long long a, long long b)
{
	if(heap[a].val > heap[b].val)
		return a;
	return b;
}

void sift(str heap[], long long n, long long x)
{
	long long aux1;
	str aux2;
	
	while( ( left_son(x) <= n && heap[x].val < heap[left_son(x)].val ) || ( right_son(x)<=n && heap[x].val < heap[right_son(x)].val ) )
	{
		if(right_son(x)<=n)
			aux1=max( heap, left_son(x), right_son(x) );
		else
			aux1=left_son(x);
		
		aux2=heap[aux1];
		heap[aux1]=heap[x];
		heap[x]=aux2;
		x=aux1;
	}
}

void percolate( str heap[], long long n, long long x )
{
	str aux = heap[x];
	while( (x > 1) && (aux.val > heap[father(x)].val) )
	{
		heap[x] = heap[father(x)];
		x = father(x);
	}
	
	heap[x]=aux;
}

void build_heap(str heap[], long long n) 
{
    for (long long i = n / 2; i > 0; --i) 
	{
        sift(heap, n, i);
    }
}

void cut( str heap[], long long &n, long long x)
{
	if( heap[x].val > heap[n].val)
	{
		heap[x]=heap[n];
		n--;
		percolate(heap, n, x);
	}
	else
	{
		heap[x]=heap[n];
		n--;
		sift(heap, n, x);
	}
}

void insert(str heap[], long long &n, long long va)
{
	heap[++n].val=va;
	heap[n].poz=n;
	percolate(heap, n, n);
}

void heapsort(str heap[], long long n)
{
	str aux;
	
	build_heap(heap, n);
	
	for(i=n; i>=2; --i)
	{
		aux=heap[1];
		heap[1]=heap[i];
		heap[i]=aux;
		sift(heap, i-1, 1);
	}
}

void printf(str heap[], long long n)
{
	long long i;
	
	for(i=1; i<=n; ++i)
		g<<heap[i].val<<" ";
	
	g<<"\n";
}

void printf2(str heap[], long long n)
{
	long long i;
	
	for(i=1; i<=n; ++i)
		g<<heap[i].poz<<" ";
	
	g<<"\n";
}

 int main()
 {
	f>>n>>k;
	
	long long naux=n;
	
	for( i=1; i <= k; ++i)
	{
		heap[i].poz=i;
		f>>heap[i].val;
	}

	heapsort(heap, k);
	
	for( i = k+1; i <= naux; i++)
	{
		s+=heap[1].val;
		
		//printf(heap,i-1);
		//g<<s<<"\n";
		
		insert(heap, n, x);
		
		if( heap[1].poz == (i-k) )
			cut(heap, n, 1);
	}
	
	g<<s;
	
	return 0;
 }