Cod sursa(job #1464867)

Utilizator TeodorescuStefanEduardTeodorescu Stefan Eduard TeodorescuStefanEduard Data 25 iulie 2015 19:38:58
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>

using namespace std;

fstream in("deque.in", ios::in);
fstream out("deque.out", ios::out);

struct nod
{
	int info,poz;
	nod *next;
	nod *prev;
} *cap, *coada, *p, *q;



long suma;
int n,k,nr,i=1;


void sterge_coada();
void adauga_coada(nod*);
void sterge_cap();

int main()
{
	int x;

	in>>n>>k;

	p=new nod;
	in>>p->info;
	p->poz=i++;
	adauga_coada(p);
	

	while(in>>x)
	{
	

		if(cap->poz<=i-k)
			sterge_cap();


		p=new nod;
		p->info=x;
		p->poz=i++;

		while(coada != 0 && p->info < coada->info)
			sterge_coada();
		adauga_coada(p);

		if(i >= k+1)
			suma+= cap->info;

	}

	out<<suma;



    in.close();
    out.close();

	return 0;
}

void sterge_coada()
{
	if(coada != cap)
	{
		q=coada;
		coada=coada->prev;
		coada->next=0;
		delete q;
	}
	else
	{
		delete coada;
		coada=0;
		cap=0;
	}
}

void adauga_coada(nod *node)
{
	if(coada == cap)
		if(cap != 0)
		{
			cap->next=node;
			node->prev=cap;
			node->next=0;
			coada=node;
		}
		else
		{
			cap=node;
			coada=node;
			cap->next=0;
			cap->prev=0;
		}
	else
	{
		coada->next=node;
		node->prev=coada;
		node->next=0;
		coada=coada->next;
	}
}

void sterge_cap()
{
	if(cap != coada)
	{
		q=cap;
		cap=cap->next;
		cap->prev=0;
		delete q;
	}
	else
	{
		delete cap;
		cap=0;
		coada=0;
	}
}