Pagini recente » Cod sursa (job #1407934) | Cod sursa (job #1195460) | Borderou de evaluare (job #224729) | Cod sursa (job #313193) | Cod sursa (job #1095523)
#include <cstdio>
#include <deque>
#include <utility>
using namespace std;
void deque_add(deque<pair<int, int>>& d, int i, int x) {
while(d.size() > 0 && d.back().second >= x) d.pop_back();
d.push_back(make_pair(i, x));
}
void deque_del(deque<pair<int, int>>& d, int i, int K) {
while(i - d.front().first >= K) d.pop_front();
}
int main(int argc, char *argv[]) {
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
int N, K;
scanf("%d%d", &N, &K);
int *v = new int[N];
for(int i = 0; i < N; ++i) {
scanf("%d", v + i);
}
long long s = 0;
deque<pair<int, int>> d;
d.push_back(make_pair(0, v[0]));
for(int i = 1; i < K; ++i) {
deque_add(d, i, v[i]);
}
s += d.front().second;
printf("%d ", d.front().second);
for(int i = K; i < N; ++i) {
deque_add(d, i, v[i]);
deque_del(d, i, K);
s += d.front().second;
printf("%d ", d.front().second);
}
printf("\n");
printf("%lld\n", s);
return 0;
}