Cod sursa(job #843300)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 27 decembrie 2012 18:31:48
Problema Deque Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 5000002

int v[MAXN];
int ququ[MAXN];
int N,K;

////////////// QUEUE ///////////////////

typedef struct tagQueue{
	int start;
	int end;
}Queue;

void initQueue(Queue *q)
{
	q->start = MAXN;
	q->end = MAXN-1;
}

void pushQueue(Queue *q, int pos)
{
	if( q->start > q->end ){
		q->start = MAXN-1;
		q->end = MAXN-1;
		ququ[MAXN-1] = pos;
	}
	else{
		int s = q->start;
		while( s <= q->end && v[ququ[s]] >= v[pos] )
			s++;
		if( s > q->end ){
			q->start = MAXN-1;
			q->end = MAXN-1;
			ququ[MAXN-1] = pos;
		}
		else{
			q->start = s-1;
			ququ[s-1] = pos;
		}		
	}
}

int topQueue(Queue *q)
{
	return ququ[q->end];
}

void popQueue(Queue *q, int v)
{
	if( ququ[q->end] != v )
		return;

	if( q->start == q->end){
		q->start = MAXN;
		q->end = MAXN-1;
	}
	else{		
		q->end--;
	}
}

void printQueue(Queue *q)
{
	int i;
	for(i=q->start;i<q->end;i++)
		printf("%d ",v[ququ[i]]);
	printf("\n");
	fflush(stdout);
}

////////////////////////////////////////

int main(int argc, char* argv[])
{
	freopen("deque.in","r",stdin);
	freopen("deque.out","w",stdout);
	
	scanf("%d %d",&N,&K);

	int i;
	for(i=1;i<=N;i++)
		scanf("%d",&v[i]);
		
	Queue q;
	long long sum = 0;
	
	initQueue(&q);	
	
	for(i=1;i<=K;i++)
		pushQueue(&q,i);
		
	sum += v[topQueue(&q)];

	for(i=K+1;i<=N;i++){
		popQueue(&q, i-K);
		pushQueue(&q, i);
		sum += v[topQueue(&q)];
	}
	printf("%lld",sum);
	return 0;
}