Cod sursa(job #1480077)

Utilizator alexandru.huleaAlexandru Hulea alexandru.hulea Data 2 septembrie 2015 01:00:50
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <deque>

using namespace std;

int main() {

	freopen("deque.in", "r", stdin);
	freopen("deque.out", "w", stdout);

	int n, k;
	scanf("%i%i", &n, &k);
	int* vec = new int[n];
	for (int i = 0; i < n; i++) {
		int x;
		scanf("%i", &x);
		vec[i] = x;
	}

	deque<int> q;
	q.push_back(0);
	long long sum = 0;

	for (int i = 1; i < n; i++) {
		// elimin valorile din ultimele k care sunt mai mari sau egale cu cel curent
		while (!q.empty() && vec[q.back()] >= vec[i]) {
			q.pop_back();
		}

		// adaug elementul curent
		q.push_back(i);

		// adaug la suma daca au fost parcurse cel putin k valori
		if (i - k >= -1) {
			sum += vec[q.front()] * 1LL;
		}

		// elimin primul element daca nu mai facea parte din ultimele k
		if (q.front() == i - k + 1) {
			q.pop_front();
		}
	}

	printf("%lli", sum);
	fclose(stdin);
	fclose(stdout);
	return 0;
}