Cod sursa(job #2818897)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 17 decembrie 2021 11:12:07
Problema Deque Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
	
#include <iostream>
#include <stdio.h>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <cassert>
 
using namespace std;
 
typedef struct deque_t *deque;
 
struct deque_t {
  int32_t value;
  deque next;
};
 
struct Deque {
  deque front;
  deque back;
  int32_t total;
};
 
struct Deque *init() {
  struct Deque *front = (struct Deque *)malloc(sizeof(struct Deque));
  memset(front, 0, sizeof(struct Deque));
  return front;
}
 
void pushBack(struct Deque *self, int32_t value) {
  deque node = (deque)malloc(sizeof(struct deque_t));
  node->next = NULL;
  node->value = value;
  if(!self->front) {
    self->front = node;
  }
  if(!self->back) {
    self->back = node;
  }
  else {
    self->back->next = node;
    self->back = node;
  }
  self->total++;
}
 
void pushFront(struct Deque *self, int32_t value) {
  deque node = (deque)malloc(sizeof(struct deque_t));
  node->next = NULL;
  node->value = value;
  if(!self->back) {
    self->back = node;
  }
  if(!self->front) {
    self->front = node;
  }
  else {
    deque last = self->front;
    self->front = node;
    self->front->next = last;
  }
  self->total++;
}
 
void deleteFront(struct Deque *self) {
  if(self->front) {
    self->front = self->front->next;
    self->total--;
  }
}
 
void show(struct Deque *self) {
  deque front = self->front;
  while(front != NULL) {
    cout << front->value << "\n";
    front = front->next;
  }
}
 
int32_t front(struct Deque *self) {
  assert(self->front != NULL);
  return self->front->value;
}
 
int32_t back(struct Deque *self) {
  assert(self->back != NULL);
  return self->back->value;
}
 
int main() {
  FILE *fd = fopen("deque.in", "r+");
  FILE *fr = fopen("deque.out", "w+");
  struct Deque *arb = init();
  int32_t n, m;
  int64_t mex = 0;
  fscanf(fd, "%d %d", &n, &m);
  for(int32_t i = 0; i < n; i++) {
    int32_t a;
    fscanf(fd, "%d", &a);
    if(arb->total >= m) {
      deleteFront(arb);
    }
    while(arb->total && front(arb) > back(arb)) {
      deleteFront(arb);
    }
    while(arb->total && front(arb) > a) {
      deleteFront(arb);
    }
    pushBack(arb, a);
    if(i >= m - 1) {
      mex += (int64_t)front(arb);
      //cout << front(arb) << "\n";
    }
  }
  fprintf(fr, "%I64d", mex);
}