Cod sursa(job #1725286)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 5 iulie 2016 13:02:00
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <algorithm>
#define MAX 60000000
using namespace std;
char f[MAX];
int pos=0,N,K,X,Deque[5000005],v[5000005],Front=1,Back=0,DequeSize=0;
long long S;
void r(int &nr)
{
	int sign=0;
	nr=0;
	while(f[pos]<'0'||f[pos]>'9')
	{
		pos++;
		if(f[pos]=='-')
			sign=1;
	}
	while(f[pos]>='0'&&f[pos]<='9')
		nr=nr*10+f[pos++]-'0';
	if(sign==1)
		nr=-nr;
}
int DequeFront()
{
	return Deque[Front];
}
int DequeBack()
{
	return Deque[Back];
}
void AddToBack(int val)
{
	Deque[++Back]=val;
	DequeSize++;
}
void RemoveFromBack()
{
	Back--;
	DequeSize--;
}
void RemoveFromFront()
{
	Front++;
	DequeSize--;
}
int main()
{
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);
	fread(f,1,MAX,stdin);
	r(N);r(K);
	for(int i=1;i<=N;i++)
	{
		r(v[i]);
		while(DequeSize>0&&v[DequeBack()]>=v[i]) RemoveFromBack();
		AddToBack(i);
		if(DequeFront()==i-K)
			RemoveFromFront();
		if(i>=K)S+=v[DequeFront()];
	}
	printf("%lld",S);
    return 0;
}