Pagini recente » Cod sursa (job #1440249) | Cod sursa (job #1229109) | Cod sursa (job #1565545) | Cod sursa (job #3127536) | Cod sursa (job #2906776)
#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
ifstream in("deque.in");
ofstream out("deque.out");
#define cin in
#define cout out
#endif // LOCAL
template < const int NMAX, typename DATA >
struct rotdq {
static const int sub1 = NMAX - 1;
DATA data[NMAX];
int bp, ep; // first, next-after-last pointers
rotdq() {
// Make sure NMAX is a power of 2
static_assert((NMAX & (NMAX - 1)) == 0);
const int MAXROT = 4; // maximum number of times the data vector can be filled
bp = MAXROT * NMAX; ep = MAXROT * NMAX;
}
int size() {
return ep - bp;
}
DATA back() { return data[(ep - 1) & sub1]; }
void push_back(const DATA& d) { data[(ep++) & sub1] = d; }
DATA pop_back() { return data[(--ep) & sub1]; }
DATA front() { return data[bp & sub1]; }
void push_front(const DATA& d) { data[(--bp) & sub1] = d; }
DATA pop_front() { return data[(bp++) & sub1]; }
};
struct MinDeque {
int* indexer = nullptr;
rotdq<(1 << 24), int> dq;
void bind(int* _ind) { indexer = _ind; }
void add_by_pop(int ind) {
while(dq.size() > 0 && indexer[dq.back()] > indexer[ind])
dq.pop_back();
dq.push_back(ind);
}
void remove(int ind) {
if(dq.front() == ind) dq.pop_front();
}
int get_min_ind() { return dq.front(); }
int get_min() { return indexer[dq.front()]; }
} mdq;
const int NMAX = 5e6 + 7;
int vals[NMAX];
int main() {
mdq.bind(vals);
int n, k; cin >> n >> k;
for(int i = 0; i < n; i++) cin >> vals[i];
int64_t ans = 0;
for(int i = 0; i < n; i++) {
mdq.add_by_pop(i);
if(i - k >= 0) mdq.remove(i - k);
if(i >= k - 1) ans = ans + mdq.get_min();
}
cout << ans << endl;
return 0;
}