Cod sursa(job #1971637)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 20 aprilie 2017 18:34:24
Problema Deque Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#include <stdbool.h>

typedef long long i64;
#define MAXN 5000000

int dq[MAXN], qb, qe;
int v[MAXN];

bool dqEmpty() {
  return qb == qe;
}

int dqFirst() {
  return dq[qb];
}

int dqLast() {
  return qe ? dq[qe - 1] : dq[MAXN - 1];
}

void dqAddLast(int x) {
  dq[qe++] = x;
  if (qe == MAXN) {
    qe = 0;
  }
}

void dqRemoveLast() {
  qe--;
  if (qe < 0) {
    qe = MAXN - 1;
  }
}

void dqRemoveFirst() {
  if (++qb == MAXN) {
    qb = 0;
  }
}

int main() {
  int n, k;
  i64 sol;
  FILE *f = fopen("deque.in", "r");
  fscanf(f, "%d%d", &n, &k);
  for (int i = 0; i < n; ++i) {
    fscanf(f, "%d", &v[i]);
  }
  fclose(f);
  sol = 0;
  for (int i = 0; i < n; ++i) {
    if (i == dqFirst() + k) {
      dqRemoveFirst();
    }
    while (!dqEmpty() && v[dqLast()] >= v[i]) {
      dqRemoveLast();
    }
    dqAddLast(i);
    if (i + 1 >= k) {
      sol += v[dqFirst()];
    }
  }
   f = fopen("deque.out", "w");
   fprintf(f, "%lld\n", sol);
   fclose(f);
   return 0;
}