Cod sursa(job #1420654)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 18 aprilie 2015 20:01:47
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <stdio.h>

using namespace std;
#define MAX 5000005

template <typename T>
class MyDeque {
public:
	int *elements;
	int capacity;
	int head;
	int tail;
	int size;

	MyDeque(int cap) {
		capacity = cap;
		head = cap / 2 - 1;
		tail = cap / 2;
		size = 0;
		elements = new T[cap + 1];
	}

	~MyDeque() {delete[] elements;}

	bool empty() {
		return size == 0;
	}

	T back() {
		if(size) {
			return elements[(tail - 1) < 0 ? capacity : tail - 1];
		}
		return T();
	}

	T front() {
		if(size)
			return elements[(head + 1) > capacity ? 0 : head + 1];
		return T();
	}

	void push_front(T elem) {
		if(size >= capacity)
			return;
		++size;
		elements[head] = elem;
		head = (head - 1) < 0 ? capacity : head - 1; 
	}

	void push_back(T elem) {
		if(size >= capacity)
			return;
		++size;
		elements[tail] = elem;
		tail = (tail + 1) > capacity ? 0 : tail + 1;
	}

	void pop_front() {
		if(empty())
			return;
		--size;
		head = (head + 1) > capacity ? 0 : head + 1;
	}

	void pop_back() {
		if(empty())
			return;
		--size;
		tail = (tail - 1) < 0 ? capacity : tail - 1;
	}

	void print() {
		if(!empty()) {
			for(int i = (head + 1) > capacity ? 0 : head + 1; i != tail; i = (i + 1) > capacity ? 0 : i + 1)
				cout << elements[i] << " ";
		}
		cout << endl;
	}
};

int main() {
	long long int n, k, *v;
	long long int sum = 0;
	scanf("%d%d", &n, &k);	
	MyDeque<int> dq(MAX);
	v = new long long int[MAX];
	freopen("deque.in", "r", stdin);
	freopen("deque.out", "w", stdout);

	for(int i = 0; i < k - 1; ++i) {
		scanf("%d", &v[i]);
		

		while(!dq.empty() && v[i] < v[dq.back()]) {
			dq.pop_back();
		}
		dq.push_back(i);
	}	

	for(int i = k - 1; i < n; ++i) {
		if(i - dq.front() >= k) {
			dq.pop_front();
		}

		scanf("%d\n", &v[i]);

		while(!dq.empty() && v[i] < v[dq.back()]) {
			dq.pop_back();		
		}
		dq.push_back(i);
		
		sum += 1LL * v[dq.front()];
	}
	delete[] v;
	cout << sum << '\n';
	return 0;
}