Cod sursa(job #2799335)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 12 noiembrie 2021 21:57:38
Problema Deque Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#include <ctype.h>

// Program de Mircea Rebengiuc
// inceput pe 2021.11.12

#define MAXBUF (128 * 1024)
#define MAXQ 8388608

int deq[MAXQ];
int p, u;

int q[MAXQ];
int qp, qu;

static inline int empty(){
  return p == u;
}

static inline int top_front(){
  return deq[p];
}

static inline void pop_front(){
  p = ((p + 1) & (MAXQ - 1));
}

static inline void pop_back(){
  u = ((u - 1 + MAXQ) & (MAXQ - 1));
}

static inline int top_back(){
  return deq[(u - 1 + MAXQ) & (MAXQ - 1)];
}

static inline void push_back( int val ){
  deq[u] = val;
  u = ((u + 1) & (MAXQ - 1));
}

static inline void push( int val ){
  q[qu] = val;
  qu = ((qu + 1) & (MAXQ - 1));
}

static inline int pop(){
  int ret = q[qp];
  qp = ((qp + 1) & (MAXQ - 1));
  return ret;
}

static inline void insert( int val ){
  push(val);
  while( !empty() && top_back() >= val )
    pop_back();
  push_back(val);
}

static inline void delete(){
  if( top_front() == pop() )
    pop_front();
}

FILE *fin, *fout;

char ibuf[MAXBUF];
int ibp = MAXBUF - 1;

static inline int bgetc(){
  if( (ibp = ((ibp + 1) & (MAXBUF - 1))) == 0 )
    fread(ibuf, sizeof(char), MAXBUF, fin);
  return ibuf[ibp];
}

static inline int fgetint(){
  int n = 0, ch, semn = 1;

  while( isspace(ch = bgetc()) );
  if( ch == '-' ){
    semn = -1;
    ch = bgetc();
  }
  do
    n = n * 10 + ch - '0';
  while( isdigit(ch = bgetc()) );

  return n * semn;
}

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

  int n, k, i;
  long long sum;
  
  p = u = qp = qu = 0;

  n = fgetint();
  k = fgetint();
  for( i = 1 ; i < k ; i++ )
    insert(fgetint());

  sum = 0;
  for( i = k - 1 ; i < n ; i++ ){
    insert(fgetint());
    sum += top_front();
    delete();
  }

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

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