Pagini recente » Cod sursa (job #655959) | Cod sursa (job #805730) | Cod sursa (job #2868836) | Cod sursa (job #1971637)
#include <stdio.h>
#include <stdbool.h>
typedef long long i64;
#define MAXN 5000000
int dq[MAXN], qb, qe;
int v[MAXN];
bool dqEmpty() {
return qb == qe;
}
int dqFirst() {
return dq[qb];
}
int dqLast() {
return qe ? dq[qe - 1] : dq[MAXN - 1];
}
void dqAddLast(int x) {
dq[qe++] = x;
if (qe == MAXN) {
qe = 0;
}
}
void dqRemoveLast() {
qe--;
if (qe < 0) {
qe = MAXN - 1;
}
}
void dqRemoveFirst() {
if (++qb == MAXN) {
qb = 0;
}
}
int main() {
int n, k;
i64 sol;
FILE *f = fopen("deque.in", "r");
fscanf(f, "%d%d", &n, &k);
for (int i = 0; i < n; ++i) {
fscanf(f, "%d", &v[i]);
}
fclose(f);
sol = 0;
for (int i = 0; i < n; ++i) {
if (i == dqFirst() + k) {
dqRemoveFirst();
}
while (!dqEmpty() && v[dqLast()] >= v[i]) {
dqRemoveLast();
}
dqAddLast(i);
if (i + 1 >= k) {
sol += v[dqFirst()];
}
}
f = fopen("deque.out", "w");
fprintf(f, "%lld\n", sol);
fclose(f);
return 0;
}