Pagini recente » Cod sursa (job #2469939) | Cod sursa (job #2961015) | Cod sursa (job #816710) | Cod sursa (job #1759784) | Cod sursa (job #2775834)
#include <fstream>
#include <stdlib.h>
using namespace std;
struct Pair {
int val, pos;
};
struct LinkedListNode {
Pair data;
LinkedListNode *next;
LinkedListNode *prev;
};
struct LinkedList {
LinkedListNode *head;
LinkedListNode *end;
size_t size;
};
LinkedList *createLinkedList(void) {
LinkedList *l = (LinkedList *) calloc(1, sizeof(LinkedList));
return l;
}
void pushBackIntoList(LinkedList *l, Pair x) {
LinkedListNode *n = (LinkedListNode *) calloc(1, sizeof(LinkedListNode));
n->data = x;
if (l->size == 0UL)
l->head = n;
n->prev = l->end;
l->end = n;
if (n->prev)
n->prev->next = n;
++(l->size);
}
Pair pollFirstFromList(LinkedList *l) {
Pair ret = l->head->data;
LinkedListNode *out = l->head;
l->head = l->head->next;
if (l->head) {
l->head->prev = NULL;
} else {
l->end = NULL;
}
--(l->size);
free(out);
return ret;
}
Pair pollLastFromList(LinkedList *l) {
Pair ret = l->end->data;
LinkedListNode *out = l->end;
l->end = l->end->prev;
if (l->end) {
l->end->next = NULL;
} else {
l->head = NULL;
}
--(l->size);
free(out);
return ret;
}
Pair getFirstFromList(LinkedList *l) {
return l->head->data;
}
Pair getLastFromList(LinkedList *l) {
return l->end->data;
}
void clearList(LinkedList *l) {
if (l == NULL)
return;
LinkedListNode *x = l->head;
while (x) {
LinkedListNode *out = x;
x = x->next;
free(out);
}
l->head = l->end = NULL;
l->size = 0UL;
}
long deque(ifstream &in) {
int n, k;
in >> n >> k;
long sum = 0L;
LinkedList *deq = createLinkedList();
int i, x;
int firstIdWithinLastSubstr = n - k;
for (i = 0; i < k; i++) {
in >> x;
while (deq->size > 0 && getLastFromList(deq).val >= x)
pollLastFromList(deq);
if (deq->size > 0 && i > firstIdWithinLastSubstr)
continue;
else
pushBackIntoList(deq, {x, i});
}
sum += getFirstFromList(deq).val;
if (getFirstFromList(deq).pos == 0)
pollFirstFromList(deq);
while (i < n) {
in >> x;
while (deq->size > 0 && getLastFromList(deq).val >= x)
pollLastFromList(deq);
if (deq->size > 0 && i > firstIdWithinLastSubstr) {
} else {
pushBackIntoList(deq, {x, i});
}
sum += getFirstFromList(deq).val;
if (getFirstFromList(deq).pos == i - k + 1)
pollFirstFromList(deq);
i++;
}
clearList(deq);
free(deq);
return sum;
}
int main(void) {
ifstream in("deque.in");
ofstream out("deque.out");
out << deque(in);
in.close();
out.close();
return 0;
}