Cod sursa(job #966584)

Utilizator sorin2kSorin Nutu sorin2k Data 26 iunie 2013 12:10:55
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include<iostream>
#include<fstream>
using namespace std;

struct Nod {
	int val, poz;
	Nod *succ, *pred;
};

struct Deque {
	Nod *head, *tail;
};

Deque init_deque() {
	Deque d;
	d.head = 0;
	d.tail = 0;
	return d;
}

Nod* make_nod(int val, int poz)
{
	Nod *n = new Nod();
	n->val = val;
	n->poz = poz;
	n->succ = 0;
	n->pred = 0;
	return n;
}

void push_front(Deque &d, int val, int poz)
{
	Nod *n = make_nod(val, poz);
	if(d.head == d.tail && d.head == 0)
	{
		d.head = d.tail = n;
	}
	else
	{
		n->succ = d.head;
		d.head->pred = n;
		d.head = n;
	}
}

void push_back(Deque &d, int val, int poz)
{
	Nod *n = make_nod(val, poz);
	if(d.head == d.tail && d.head == 0)
	{
		d.head = d.tail = n;
	}
	else
	{
		d.tail->succ = n;
		n->pred = d.tail;
		d.tail = n;
	}
}

int isEmpty(Deque d)
{
	if(d.head == d.tail && d.head == 0)
		return 1;
	return 0;
}

void pop_front(Deque &d)
{
	if(!isEmpty(d))
	{
		if(d.head == d.tail)
		{
			delete d.head;
			d.head = 0;
			d.tail = 0;
		}
		else
		{
			Nod *p = d.head;
			d.head = p->succ;
			d.head->pred = 0;
			delete p;
		}
	}
}

void pop_back(Deque &d)
{
	if(!isEmpty(d))
	{
		if(d.head == d.tail)
		{
			delete d.tail;
			d.head = 0;
			d.tail = 0;
		}
		else
		{
			Nod *p = d.tail;
			d.tail = p->pred;
			d.tail->succ = 0;
			delete p;
		}
	}
}

void print_nodes(Deque d)
{
	Nod *n = d.head;
	while(n != 0)
	{
		cout << n->val << " ";
		n = n->succ;
	}
}

int front(Deque d)
{
	if(!isEmpty(d))
	{
		return d.head->val;
	}
	return 0;
}

int back(Deque d)
{
	if(!isEmpty(d))
	{
		return d.tail->val;
	}
	return 0;
}

int main()
{
	ifstream fin("deque.in");
	ofstream fout("deque.out");
	int *a, n, k, i;
	long long rez = 0;
	Deque d = init_deque();
	fin >> n >> k;
	a = new int[n];
	for(i = 0; i < n; i++)
	{
		fin >> a[i];
	}
	// punem primele k elemente in deque, in ordine crescatoare
	for(i = 0; i < k; i++)
	{
		if(isEmpty(d))
		{
			push_back(d, a[i], i);
		}
		else
		{
			while(a[i] <= back(d) && !isEmpty(d))
			{
				pop_back(d);
			}
			push_back(d, a[i], i);
		}
	}
	rez += front(d);
	for(i = k; i < n; i++)
	{
		while(a[i] <= back(d) && !isEmpty(d))
		{
			pop_back(d);
		}
		push_back(d, a[i], i);
		while(d.head->poz <= i - k)
		{
			pop_front(d);
		}
		rez += front(d);
	}
	fout << rez << endl;
	return 0;
}