Cod sursa(job #1051471)

Utilizator BionicMushroomFMI - Dumitrescu Tiberiu Alexandru BionicMushroom Data 10 decembrie 2013 04:59:20
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
using namespace std;

int *heap, len = -1, *v;

void interschimba(int &a, int &b)
{
	int aux = a;
	a = b;
	b = aux;
}

void urca(int nod)
{
	while (nod > 1 && v[heap[nod]]<v[heap[nod / 2]])
	{
		interschimba(heap[nod], heap[nod / 2]);
		nod /= 2;
	}
}

void coboara(int nod)
{
	while (nod * 2 + 1 <= len && (v[heap[nod]] > v[heap[nod * 2]] || v[heap[nod]] > v[heap[nod * 2 + 1]]))
	{
		int poz = nod * 2;

		if (v[heap[poz + 1]] < v[heap[poz]])
			++poz;
		interschimba(heap[nod], heap[poz]);
		nod = poz;
	}
	if (nod * 2 == len && v[heap[nod]] > v[heap[nod * 2]])
		interschimba(heap[nod], heap[nod * 2]);
}

void insereaza(int nod)
{
	heap[++len] = nod;
	urca(len);
}

void elimina(int nod)
{
	heap[nod] = heap[len--];
	coboara(nod);
}

int main()
{
	int n, k;
	long long sum = 0;
	ifstream f("deque.in");
	f >> n >> k;
	v = new int[n];
	heap = new int[n];
	for (int i = 0; i < n; i++)
	{
		f >> v[i];
		while (len >= 0 && (i - heap[0] >= k))
			elimina(0);
		while (len >= 0 && v[heap[0]] >= v[i])
			elimina(0);
		insereaza(i);
		if (i >= k - 1)
			sum += v[heap[0]];

	}
	f.close();
	ofstream g("deque.out");
	g << sum;
	g.close();
	return 0;
}