Cod sursa(job #2675849)

Utilizator TghicaGhica Tudor Tghica Data 22 noiembrie 2020 17:58:51
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#define MAX_N 5000000//cea mai apropiata putere a lui 2 e 8,388,608 :(

int v[MAX_N][2];
int first, size;

int push_front(int val, int poz) {
  if (size == MAX_N)
    return 0;
  if (size == 0)
    first = 0;
  else {
    --first;
    if (first == -1)
      first = MAX_N - 1;
  }
  v[first][0] = val;
  v[first][1] = poz;
  ++size;
  return 1;
}

int push_back(int val, int poz) {
  if (size == MAX_N)
    return 0;
  v[(first + size) % MAX_N][0] = val;
  v[(first + size) % MAX_N][1] = poz;
  ++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 frontVal() {
  return size > 0 ? v[first][0] : -1;
}

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

int frontPoz() {
  return size > 0 ? v[first][1] : -1;
}

int backPoz() {
  return size > 0 ? v[(first + size - 1) % MAX_N][1] : -1;
}
int main() {
  FILE *fin, *fout;
  fin = fopen( "deque.in", "r" );
  fout = fopen( "deque.out", "w" );
  int i, n, k, a;
  long long s;
  fscanf( fin, "%d", &n );
  fscanf( fin, "%d", &k );
  for( i = 1; i <= k; i++ ) {
    fscanf( fin, "%d", &a );
    while( size && backVal() > a ) {
      pop_back();
    }
    push_back( a, i );
  }
  s = frontVal();
  for( i = k + 1; i <= n; i++ ) {
    fscanf( fin, "%d", &a );
    if( i - frontPoz() == k )
      pop_front();
    while( size && backVal() > a ) {
      pop_back();
    }
    push_back( a, i );
    s += frontVal();
  }
  fprintf( fout, "%lld", s );
  return 0;
}