Cod sursa(job #1442982)

Utilizator RanKBrinduse Alexandru RanK Data 26 mai 2015 17:12:50
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef long long int int64;

#include <list>

struct NODE
{
	int value;
	int index;
};

using namespace std;

#define IN_FILE_NAME "deque.in"
#define OUT_FILE_NAME "deque.out"

int main()
{
	FILE *pFin, *pFout;

	pFin = fopen(IN_FILE_NAME, "r");
	pFout = fopen(OUT_FILE_NAME, "w");

	int n,k;
	fscanf(pFin, "%d %d", &n, &k);

	int *arr = new int[n];

	int i;
	for(i=0; i<n; i++)
	{
		int nr;
		fscanf(pFin, "%d", &nr);
		arr[i] = nr;
	}
	
	list<NODE*> Q = list<NODE*>();
	for(i=0; i<k; i++)
	{
		int nr = arr[i];
		while(!Q.empty() && Q.back()->value > nr)
		{
			delete Q.back();
			Q.pop_back();
		}
		NODE *node = new NODE;
		node->value = nr;
		node->index = i;
		Q.push_back(node);
	}

	int64 sum = 0;
	for(i=0; i<=n-k; i++)
	{
		NODE *node = Q.front();
		sum += node->value;
		if(node->index <= i)
		{
			Q.pop_front();
			delete node;
		}
		
		if(i < n-k)
		{
			int nr = arr[i+k];
			while(!Q.empty() && Q.back()->value > nr)
			{
				delete Q.back();
				Q.pop_back();
			}
			NODE *newNode = new NODE;
			newNode->value = nr;
			newNode->index = i+k;
			Q.push_back(newNode);
		}
	}
	Q.clear();
	fprintf(pFout, "%lld\n", sum);

	fclose(pFin);
	fclose(pFout);
	return 0;
}