Cod sursa(job #1212564)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 25 iulie 2014 10:41:36
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 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;


Deque* new_deque()
{
    Deque* deque = new Deque;
    deque->first = deque->last = 0;
    return deque;
}

DequeNode* new_deque_node()
{
    DequeNode* node = new DequeNode;
    node->next = node->prev = 0;
    return node;
}

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;
		deque->last = 0;
		return;
	}
	
	delete deque->last;
	deque->last = prev;
	deque->last->next = 0;
}

void add_last(Deque* deque, int e)
{
	DequeNode* node = new_deque_node();
	node->val = e;
	
	if (is_empty_deque(deque))
	{
		deque->first = node;
	}
	
	if (deque->last != 0)
	{
		deque->last->next = node;
		node->prev = deque->last;
	}
	
	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;
		deque->first = 0;
		return;
	}
	
	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[i] < A[get_last(deque)])
		{
			remove_last(deque);
		}
		
		add_last(deque, i);
	}
	
	for (int i = k; i <= n; ++i)
	{
		if (get_first(deque) < (i-k+1))
		{
			remove_first(deque);
		}
	
		ifs >> A[i];
		while (!is_empty_deque(deque) && A[i] < A[get_last(deque)])
		{
			remove_last(deque);
		}
		
		add_last(deque, i);
		
		sum += A[get_first(deque)];
	}
	
	ofs << sum << "\n";
	
	delete deque->first;
	delete deque;

	return 0;
}