Cod sursa(job #2818851)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 17 decembrie 2021 00:29:46
Problema Deque Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 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);
    pushBack(arb, a);
    if(arb->total > m) {
      deleteFront(arb);
    }
    while(front(arb) > back(arb)) {
      deleteFront(arb);
    }
    if(i >= m - 1) {
      mex += (int64_t)front(arb);
    }
  }
  fprintf(fr, "%I64d", mex);
}