Cod sursa(job #2818929)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 17 decembrie 2021 12:30:27
Problema Deque Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 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+");
  int32_t n, m;
  int64_t mex = 0;
  int32_t *arc = (int32_t *)malloc(sizeof(int32_t) * 5000094);
  int32_t *x = (int32_t *)malloc(sizeof(int32_t) * 5000094);
  int32_t back = 0, front = 1, total = 0;
  fscanf(fd, "%d %d", &n, &m);
  for(int32_t i = 1; i <= n; i++) {
    fscanf(fd, "%d", &x[i]);
    while(front <= back && x[i] <= x[arc[back]]) {
      back--;
    }
    arc[++back] = i; 
    if(arc[front] == i - m) {
      front++;
    }
    if(i >= m) {
     // cout << x[arc[front]] << "\n";
      //exit(0);
      mex += (int64_t)x[arc[front]];
    }
  }
  fprintf(fr, "%I64ld", mex);
}