Pagini recente » Cod sursa (job #2678467) | Cod sursa (job #2166379) | Cod sursa (job #323684) | Cod sursa (job #2607193) | Cod sursa (job #2370213)
#include <cstdio>
#include <queue>
#define DEBUG 0
#define N_MAX 5000001
int N, k, n[N_MAX];
long long answer = 0;
std::deque<std::pair<int, int> > dq;
void dqInsert(int value, int position) {
while (!dq.empty() && value <= dq.back().first) dq.pop_back();
dq.push_back(std::make_pair(value, position));
}
int dqMin(int limit) {
while (dq.front().second < limit) dq.pop_front();
return dq.front().first;
}
int main() {
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
scanf("%d%d", &N, &k);
for (int it = 0; it < N; ++it) {
scanf("%d", &n[it]);
if (it < k) {
dqInsert(n[it], it);
}
}
answer += dqMin(0);
if (DEBUG) printf("%d\n", dqMin(0));
if (DEBUG) {
for (int it = 0; it < dq.size(); ++it) printf("%d ", dq[it].first);
printf("\n");
}
for (int it = k; it < N; ++it) {
dqInsert(n[it], it);
answer += dqMin(it - k + 1);
if (DEBUG) printf("%d\n", dqMin(it - k + 1));
if (DEBUG) {
for (int it = 0; it < dq.size(); ++it) printf("%d ", dq[it].first);
printf("\n");
}
}
if (DEBUG) printf("\n");
printf("%lld\n", answer);
return 0;
}