Cod sursa(job #1497206)

Utilizator meeprrMelinte Paul meeprr Data 6 octombrie 2015 14:19:34
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <ctype.h>

using namespace std;

#define BUFF_SIZE 4096

int vec[50000001],counter;
char c, sign, buff[BUFF_SIZE];
int pos = BUFF_SIZE;

inline char getChar(FILE *f) {
    if (pos == BUFF_SIZE) {
        fread(buff, 1, BUFF_SIZE, f);
        pos = 0;
    }
    return buff[pos++];
}

inline void freef(FILE *f, const char *type, int *result) {
  *result = 0;
  c = '#';
  do {
    sign = c;
    c = getChar(f);
  } while (!isdigit(c));
  do {
    *result = (*result << 3) + (*result << 1) + c - '0';
    c = getChar(f);
  } while (isdigit(c));

  if (sign == '-') {
    *result = -(*result);
  }
}
int minim(int a,int b)
{
    int mini = 10000001;

    for(int i=a; i<=b; i++)
    {
        if (vec[i]<mini) {mini=vec[i]; counter=i;}
    }
    return mini;
}

int main()
{
    FILE *in = fopen("deque.in", "r");
    FILE *out = fopen("deque.out", "w");
    int n,aux,k,mini;

    freef(in, "%d", &n);
    freef(in, "%d", &k);
    for(int i=1;i<=n;i++) freef(in, "%d", &vec[i]);

    mini=minim(1,k);
    long long int sum=mini;


    for (int i=k+1;i<=n;i++)
    {
        counter--;
        if (counter==0)
        {
            mini=minim(i-k+1,i);
            counter=counter-i+k;
        }
        else if(mini>vec[i])
        {
            mini=vec[i];
            counter=k;
        }
        sum+=mini;
    }

    fprintf(out, "%lld\n", sum);
    fclose(in);
    fclose(out);

    return 0;
}