Pagini recente » Cod sursa (job #2978046) | Cod sursa (job #711085) | Cod sursa (job #1618690) | Cod sursa (job #1877128) | Cod sursa (job #2801719)
#include <stdio.h>
#include <stdint.h>
void read_int64_t(FILE *__restrict stream, int64_t *__restrict nr) {
uint8_t ch;
int8_t sgn = 1;
*nr = 0;
ch = fgetc(stream);
if (ch == '-') {
sgn = -1;
} else if (('0' <= ch && ch <= '9')) {
*nr = ch - '0';
} else {
return;
}
while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
*nr *= 10;
*nr += ch - '0';
}
if (ch == '\r') {
fgetc(stream);
}
*nr *= sgn;
}
int64_t n, k;
int64_t a[5000001];
struct deque {
int64_t q[5000001];
uint64_t qs;
uint64_t qe;
};
int64_t dq_top(struct deque *__restrict dq) {
return dq->q[dq->qe-1];
}
int64_t dq_bot(struct deque *__restrict dq) {
return dq->q[dq->qs];
}
void dq_pop_top(struct deque *__restrict dq) {
--dq->qe;
}
void dq_pop_bot(struct deque *__restrict dq) {
++dq->qs;
}
void dq_push_top(struct deque *__restrict dq, int64_t val) {
dq->q[dq->qe] = val;
++dq->qe;
}
struct deque dq = {0};
int main(void) {
int64_t sum = 0;
{
FILE *__restrict in = fopen("deque.in", "r");
read_int64_t(in, &n);
read_int64_t(in, &k);
{
int64_t i;
for(i = 0; i < n; ++i) {
read_int64_t(in, a+i);
if (dq.qs < dq.qe && dq_bot(&dq) == i-k) {
dq_pop_bot(&dq);
}
while (dq.qs < dq.qe && a[dq_top(&dq)] >= a[i]) {
dq_pop_top(&dq);
}
dq_push_top(&dq, i);
if (i >= k - 1) {
sum += a[dq_bot(&dq)];
}
}
}
fclose(in);
}
{
FILE *__restrict out = fopen("deque.out", "w");
fprintf(out, "%li", sum);
fclose(out);
}
return 0;
}