Pagini recente » Cod sursa (job #356626) | Cod sursa (job #248660) | Cod sursa (job #1944005) | Cod sursa (job #829129) | Cod sursa (job #2818929)
#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);
}