Cod sursa(job #2801719)

Utilizator ptlsebiptl sebi ptlsebi Data 16 noiembrie 2021 19:52:08
Problema Deque Scor 60
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#include <stdint.h>
void read_int64_t(FILE *__restrict stream, int64_t *__restrict nr) {
  uint8_t ch;
  int8_t sgn = 1;
  *nr = 0;
  ch = fgetc(stream);
  if (ch == '-') {
    sgn = -1;
  } else if (('0' <= ch && ch <= '9')) {
    *nr = ch - '0';
  } else {
    return;
  }
  while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
    *nr *= 10;
    *nr += ch - '0';
  }
  if (ch == '\r') {
    fgetc(stream);
  }
  *nr *= sgn;
}

int64_t n, k;
int64_t a[5000001];

struct deque {
  int64_t q[5000001];
  uint64_t qs;
  uint64_t qe;
};

int64_t dq_top(struct deque *__restrict dq) {
  return dq->q[dq->qe-1];
}

int64_t dq_bot(struct deque *__restrict dq) {
  return dq->q[dq->qs];
}

void dq_pop_top(struct deque *__restrict dq) {
  --dq->qe;
}

void dq_pop_bot(struct deque *__restrict dq) {
  ++dq->qs;
}

void dq_push_top(struct deque *__restrict dq, int64_t val) {
  dq->q[dq->qe] = val;
  ++dq->qe;
}

struct deque dq = {0};

int main(void) {
  int64_t sum = 0;
  {
    FILE *__restrict in = fopen("deque.in", "r");
  
    read_int64_t(in, &n);
    read_int64_t(in, &k);
    {
      int64_t i;
      for(i = 0; i < n; ++i) {
        read_int64_t(in, a+i);
        if (dq.qs < dq.qe && dq_bot(&dq) == i-k) {
          dq_pop_bot(&dq);
        }
        while (dq.qs < dq.qe && a[dq_top(&dq)] >= a[i]) { 
          dq_pop_top(&dq);
        }
        dq_push_top(&dq, i);
        if (i >= k - 1) {
          sum += a[dq_bot(&dq)];
        }
      }
    }
  
    fclose(in);
  }

  {
    FILE *__restrict out = fopen("deque.out", "w");
  
    fprintf(out, "%li", sum);
  
    fclose(out);
  }


  return 0;
}