Cod sursa(job #2669216)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 6 noiembrie 2020 14:44:33
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
// Mihai Priboi

#include <bits/stdc++.h>
#define MAXN 5000000
#define MAXX 10000000

// Aveam struct, dar imi dadea eroare din cauza ca MAXN ul este prea mare

int arr[MAXN], arr_ind[MAXN];
int arr_size = 0, arr_start = 0, arr_end = 0;

void push_front( int x, int i ) {
  if( arr_size == 0 ) {
    arr_start = arr_end = 0;
  }
  else {
    if( arr_start == 0 )
      arr_start = MAXN;
    arr_start--;
  }
  arr[arr_start] = x;
  arr_ind[arr_start] = i;
  arr_size++;
}

void push_back( int x, int i ) {
  if( arr_size == 0 ) {
    arr_start = arr_end = 0;
  }
  else {
    arr_end++;
    if( arr_end == MAXN )
      arr_end = 0;
  }
  arr[arr_end] = x;
  arr_ind[arr_end] = i;
  arr_size++;
}

int front( int *x, int *i ) {
  if( arr_size == 0 ) {
    *x = -MAXX - 1;
    *i = -1;
    return -1;
  }
  *i = arr_ind[arr_start];
  *x = arr[arr_start];
  return arr_size;
}

int end( int *x, int *i ) {
  if( arr_size == 0 ) {
    *x = MAXX + 1;
    *i = MAXN;
    return -1;
  }
  *i = arr_ind[arr_end];
  *x = arr[arr_end];
  return arr_size;
}

int pop_front() {
  if( arr_size == 0 )
    return -1;
  arr_size--;
  arr_start++;
  if( arr_start == MAXN )
    arr_start = 0;
  return arr_size;
}

int pop_back() {
  if( arr_size == 0 )
    return -1;
  arr_size--;
  arr_end--;
  if( arr_end == -1 )
    arr_end = MAXN - 1;
  return arr_size;
}

int size() {
  return arr_size;
}


int main() {
  FILE *fin, *fout;
  int n, k, x, val, ind, i;
  long long sum;
  fin = fopen( "deque.in", "r" );
  fscanf( fin, "%d%d", &n, &k );
  sum = 0;
  for( i = 0; i < k - 1; i++ ) {
    fscanf( fin, "%d", &x );
    front( &val, &ind );
    while( val >= x ) {
      pop_front();
      front( &val, &ind );
    }
    push_front( x, i );
  }
  for( ; i < n; i++ ) {
    fscanf( fin, "%d", &x );
    front( &val, &ind );
    while( val >= x ) {
      pop_front();
      front( &val, &ind );
    }
    push_front( x, i );
    end( &val, &ind );
    while( ind <= i - k ) {
      pop_back();
      end( &val, &ind );
    }
    sum += val;
  }
  fclose( fin );
  fout = fopen( "deque.out", "w" );
  fprintf( fout, "%lld", sum );
  fclose( fout );
  return 0;
}