Cod sursa(job #243873)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 14 ianuarie 2009 10:18:25
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>

#define maxn 5000010
#define IN "deque.in"
#define OUT "deque.out"

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

int n,k;
int a[maxn],deque[maxn];
int prim,ult;
long long sum;

int main()
{
 int i;

 fscanf(fin,"%d %d ",&n,&k);
 for(i=1;i<=n;i++) 
  fscanf(fin,"%d ",&a[i]);
 fclose(fin);
 

 prim=1;
 ult=0;

 for(i=1;i<=n;i++)
 {
  // Cat timp elementul curent este mai mic decat ultimul element din deque, 
  // eliminam pozitia ultimului element din deque                
  
  while(prim<=ult && a[i]<=a[deque[ult]])
   ult--;		
   
  // Adaug valoarea
   
  ult++; 
  deque[ult]=i;

  // Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque
  // deoarece acesta nu mai conteaza pentru pasii >= i 
  
  if(deque[prim]==i-k)
   prim++;

  // Afisam minimul, acesta aflandu-se in varful deque-ului   
  
  if(i>=k)
   sum+=a[deque[prim]]; 	
 }

 fprintf(fout,"%lld\n",sum);
 fclose(fout);
 
 return 0;
}