Cod sursa(job #2669444)

Utilizator Teodor94Teodor Plop Teodor94 Data 6 noiembrie 2020 23:02:59
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>

#define MAX_N 5000000
#define MAX_VAL 10000000
#define INVALID -(MAX_VAL + 1)

struct deque {
  int v[MAX_N];
  int first, size;

  int push_front(int val) {
    if (size == MAX_N) // deque e plin
      return 0;        // returnam eroare

    if (size == 0) // nu avem elemente
      first = 0;   // primul va fi adaugat pe pozitia zero
    else {
      --first;     // tragem first mai in stanga
      if (first == -1)
        first = MAX_N - 1;
    }

    v[first] = val;
    ++size;
    return 1;
  }

  int push_back(int val) {
    if (size == MAX_N) // deque e plin
      return 0;        // returnam eroare

    v[(first + size) % MAX_N] = val;
    ++size;
    return 1;
  }

  int pop_front() {
    if (size == 0)
      return 0;

    ++first;
    if (first == MAX_N)
      first = 0;
    --size;
    return 1;
  }

  int pop_back() {
    if (size == 0)
      return 0;

    --size;
    return 1;
  }

  int front() {
  return size > 0 ? v[first] : INVALID;
  }

  int back() {
  return size > 0 ? v[(first + size - 1) % MAX_N] : INVALID;
  }
};

deque myDeque;
int v[MAX_N];

int main() {
  FILE* fin = fopen("deque.in", "r");
  FILE* fout = fopen("deque.out", "w");

  int n, k, i;
  long long sum;
  fscanf(fin, "%d%d", &n, &k);

  for (i = 0; i < k - 1; ++i) {
    fscanf(fin, "%d", &v[i]);

    while (myDeque.size > 0 && v[i] <= v[myDeque.back()])
      myDeque.pop_back();

    myDeque.push_back(i);
  }

  sum = 0;
  for (i = k - 1; i < n; ++i) {
    fscanf(fin, "%d", &v[i]);

    if (i - myDeque.front() == k)
      myDeque.pop_front();

    while (myDeque.size > 0 && v[i] <= v[myDeque.back()])
      myDeque.pop_back();

    myDeque.push_back(i);

    sum += v[myDeque.front()];
  }

  fprintf(fout, "%lld\n", sum);

  fclose(fin);
  fclose(fout);
  return 0;
}