Cod sursa(job #1212570)

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


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

int A[SIZE];
int DQ[SIZE], first = 1, last = 0;

bool is_empty_deque()
{
	return (first > last);
}

int get_last()
{
	return DQ[last];
}

int get_first()
{
	return DQ[first];
}

void remove_last()
{
    --last;
}

void add_last(int e)
{
    DQ[++last] = e;
}

void remove_first()
{
    ++first;
}

int main()
{
	int n, k;
	long long sum = 0;
	
	ifs >> n >> k;
	
	for (int i = 1; i < k; ++i)
	{
		ifs >> A[i];
		while (!is_empty_deque() && A[i] < A[get_last()])
		{
			remove_last();
		}
		
		add_last(i);
	}
	
	for (int i = k; i <= n; ++i)
	{
		if (get_first() < (i-k+1))
		{
			remove_first();
		}
	
		ifs >> A[i];
		while (!is_empty_deque() && A[i] < A[get_last()])
		{
			remove_last();
		}
		
		add_last(i);
		
		sum += A[get_first()];
	}
	
	ofs << sum << "\n";
	
	return 0;
}