Cod sursa(job #235773)

Utilizator blasterzMircea Dima blasterz Data 25 decembrie 2008 20:20:57
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
//deque
#include <cstdio>
#include <string>
#define dim 8192
#define N 5000001

char ax[dim];
int pz;

inline void cit(int &x)
{
	x=0;
	while((ax[pz]<'0' || ax[pz]>'9') && ax[pz]!='-')
		if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
	int neg=0;
	if(ax[pz]=='-')
	{
		neg=1;
		if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
	}
	
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
	}
	
	if(neg) x=-x;
}


int a[N], dq[N];
int p=1, q=0;
int n, K;

inline void insert(int i)
{
	while(p<=q && a[i] <= a[dq[q]]) --q;
	dq[++q]=i;
}

inline int query(int i)
{
	while(p<=q && dq[p] <= i) ++p;
	return a[dq[p]];
}
int main()
{
	freopen("deque.in","r",stdin);
	freopen("deque.out","w",stdout);
	cit(n); cit(K);
	int i, j;
	long long sol=0;
	for(i=1;i<=n;++i) cit(a[i]);
	
	for(i=1;i<=n;++i)
	{
		//while(p<=q && a[i] <= a[dq[q]]) --q;
		//dq[++q]=i;
		insert(i);
		//if(dq[p] == i-K) ++p;
		
		if(i>=K) sol+=query(i-K);//a[dq[p]];
	}
	
	printf("%lld\n", sol);
	
	return 0;
}