Cod sursa(job #659130)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 10 ianuarie 2012 09:56:41
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
/*
	v[i] 			= al i-lea element citit
	q 				= pastreaza elementele din vector in ordine crescatoare
	poz[i] 		= pozitia elementului q[i] in raport cu vectorul v
*/

#include<cstdio>
#include<deque>

using namespace std;
long long n, k, sum;
deque <long long> q, poz;

int main() {
	long long i, x, top = 0;
	
	freopen("deque.in", "r", stdin), freopen("deque.out", "w", stdout);
	
	// Citire date
	scanf("%lld %lld", &n, &k);	
	
	sum = 0;
	for(i = 0; i < n; i++) {
		scanf("%lld", &x);
		
		// Extragem ultimul element din coada cat timp acesta
		// este mai mare sau egal cu elementul curet
		while(q.size() > 0 && q.back() >= x) {			
			q.pop_back();
			poz.pop_back();
		}
		
		// Adaugam elementul in coada
		q.push_back(x);
		poz.push_back(i);
		top++;
		
		// daca avem elementele unei secvente parcurse
		if(top == k) {
			sum += q.front();
			
			// daca primiul element din coada (minimul) nu mai apartine
			// secventei atunci il scoatem din coada
			if(poz.front() <= i - k + 1) {
				q.pop_front();
				poz.pop_front();
			}
			
			top--;
		}
	}
	
	printf("%lld\n", sum);
	
	return 0;
}