Cod sursa(job #602024)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 8 iulie 2011 19:29:31
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
using namespace std;
#include<stdio.h>
const int N=5000002;
int st=1,dr=0,d[N];
long long n,k,v[N],s;

void stanga( int i)
{
	if(d[st]==i-k)
		++st;
}

void dreapta ( int ii)
{
	//printf("ii = %d\n",ii);
	while(st<=dr && v[d[dr]]>=v[ii])
	{
		if(v[d[dr]]<v[ii])
			break;
		//printf("st=%d, dr=%d\n",st,dr);
		//printf("elimin %d din cauza lui v[%d] = %d\n",v[d[dr]],ii,v[ii]);
		--dr;
	}
	d[++dr]=ii;
}

int main()
{
	freopen("deque.in","r",stdin);
	freopen("deque.out","w",stdout);
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;++i)
		scanf("%lld",&v[i]);
	for(int i=1 ; i<k ; i++)
	{
		//printf("i = %d\n",i);
		dreapta(i);
		//printf("min = %d\n",v[d[st]]);
	}
	
	for(int i=k ; i<=n ; i++)
	{
		stanga(i);
		dreapta(i);
		//printf("min = %d\n",v[d[st]]);
		s += v[d[st]];
	}
	printf("%lld", s);
	return 0;
}