Cod sursa(job #1212540)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 25 iulie 2014 02:39:11
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <fstream>
#define SIZE 5000001
using namespace std;


ifstream ifs("deque.in");
ofstream ofs("deque.out");

int A[SIZE];

typedef struct DequeNode
{
	int val;
	DequeNode* next;
	DequeNode* prev;
} DequeNode;


typedef struct Deque
{
	DequeNode* first;
	DequeNode* last;
} Deque;


bool is_empty_deque(Deque* deque)
{
	return (deque->first == 0);
}

int get_last(Deque* deque)
{
	return deque->last->val;
}

int get_first(Deque* deque)
{
	return deque->first->val;
}

void remove_last(Deque* deque)
{
	if (is_empty_deque(deque)) return;
	
    DequeNode* prev = deque->last->prev;

	if (deque->first == deque->last)
	{
		delete deque->first;
		deque->first = 0;
	}
	
	delete deque->last;
	deque->last = prev;
	deque->last->next = 0;
}

void add_last(Deque* deque, int e)
{
	DequeNode* node = new DequeNode;
	node->val = e;
	
	if (deque->first == deque->last)
	{
		deque->first = node;
	}
	
	if (deque->last != 0)
	{
		deque->last->next = node;
	}
	
	deque->last = node;
}

void remove_first(Deque* deque)
{
	if (is_empty_deque(deque)) return;
	
	DequeNode* next = deque->first->next;
	
	if (deque->first == deque->last)
	{
		delete deque->last;
		deque->last = 0;
	}
	
	delete deque->first;
	deque->first = next;
	deque->first->prev = 0;
}

int main()
{
	int n, k;
	int sum = 0;
	Deque* deque = new Deque;
	
	ifs >> n >> k;
	
	for (int i = 1; i < k; ++i)
	{
		ifs >> A[i];
		while (!is_empty_deque(deque) && A[get_last(deque)] >= A[i])
		{
			remove_last(deque);
		}
		
		add_last(deque, i);
	}
	
	for (int i = k; i <= n; ++i)
	{
		if (get_first(deque) < (n-k+1))
		{
			remove_first(deque);
		}
	
		ifs >> A[i];
		while (!is_empty_deque(deque) && A[get_last(deque)] >= A[i])
		{
			remove_last(deque);
		}
		
		add_last(deque, i);

		sum += A[get_first(deque)];
	}
	
	ofs << sum << "\n";

	return 0;
}