Cod sursa(job #2801699)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 16 noiembrie 2021 19:39:23
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>

#define NMAX 5000000
#define VALMAX 10000000
#define INVALID -(VALMAX + 1)

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

  int push_front(int val) {
    if (size == NMAX)
      return 0;


    if (size == 0)
      first = 0;
    else {
      first --;
      if (first == -1)
        first = NMAX - 1;
    }
    v[first] = val;
    size ++;
    return 1;
  }

  int push_back(int val) {
    if (size == NMAX)
      return 0;

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

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

    first ++;
    if (first == NMAX)
      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) % NMAX] : INVALID;
  }
};

deque MyD;
int v[NMAX];

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

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

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

    while (MyD.size > 0 && v[i] <= v[MyD.back()])
      MyD.pop_back();
    MyD.push_back(i);
  }
  sum = 0;
  for (int i = k - 1; i < n; ++i) {
    fscanf(fin, "%d", &v[i]);

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

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

    MyD.push_back(i);

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

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