Pagini recente » Cod sursa (job #1818669) | Cod sursa (job #1291375) | Cod sursa (job #1882415) | Cod sursa (job #1206455) | Cod sursa (job #2801699)
#include <stdio.h>
#define NMAX 5000000
#define VALMAX 10000000
#define INVALID -(VALMAX + 1)
struct deque {
int v[NMAX];
int first, size;
int push_front(int val) {
if (size == NMAX)
return 0;
if (size == 0)
first = 0;
else {
first --;
if (first == -1)
first = NMAX - 1;
}
v[first] = val;
size ++;
return 1;
}
int push_back(int val) {
if (size == NMAX)
return 0;
v[(first + size) % NMAX] = val;
size ++;
return 1;
}
int pop_front() {
if (size == 0)
return 0;
first ++;
if (first == NMAX)
first = 0;
size --;
return 1;
}
int pop_back() {
if (size == 0)
return 0;
size --;
return 1;
}
int front() {
return size > 0 ? v[first] : INVALID;
}
int back() {
return size > 0 ? v[(first + size - 1) % NMAX] : INVALID;
}
};
deque MyD;
int v[NMAX];
int main() {
FILE* fin = fopen("deque.in", "r");
FILE* fout = fopen("deque.out", "w");
int n, k;
long long sum;
fscanf(fin, "%d%d", &n, &k);
for (int i = 0; i < k - 1; i ++) {
fscanf(fin, "%d", &v[i]);
while (MyD.size > 0 && v[i] <= v[MyD.back()])
MyD.pop_back();
MyD.push_back(i);
}
sum = 0;
for (int i = k - 1; i < n; ++i) {
fscanf(fin, "%d", &v[i]);
if (i - MyD.front() == k)
MyD.pop_front();
while (MyD.size > 0 && v[i] <= v[MyD.back()])
MyD.pop_back();
MyD.push_back(i);
sum += v[MyD.front()];
}
fprintf(fout, "%lld\n", sum);
return 0;
}