Cod sursa(job #371184)

Utilizator avram_florinavram florin constantin avram_florin Data 4 decembrie 2009 00:55:08
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<cstdio>
#define Maxn 5000010 
using namespace std;
int i,n,k,front,back,a[Maxn],deque[Maxn];
long long s;
int main ()
{
	freopen("deque.in", "r" , stdin);
	freopen("deque.out", "w" ,stdout);
	scanf("%d %d" , &n , &k);	//citire n si k;
	s=0;
	for(i=1;i<=n;i++)
		scanf("%d" , &a[i]);	//citire vector
	front=1;
	back=0;
	for(i=1;i<=n;i++)
		{
			while(front <= back && a[i] <= a[deque [back] ])	//cat timp elementul de pe pozitia i este mai mic decat cel de pe ultima pozitie in deque scad back;
				 back--;
			deque[++back]=i;	//crestem back-ul si adaugam pe pozitia acestuia valoarea lui i
			if(deque[front]==i-k)
				front++;	//daca pozitia minimului este egala cu i-k il eliminam pentru ca nu mai conteaza pentru numerele >=i;
			if(i>=k)
				s+=a[deque[front]];	//adaugam la suma minimul ;
		}
	printf("%lld\n" , s);
	return 0;
}