Pagini recente » Cod sursa (job #470295) | Cod sursa (job #1735458) | Cod sursa (job #30915) | Cod sursa (job #2263907) | Cod sursa (job #3172503)
#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
ifstream in("deque.in");
ofstream out("deque.out");
#define cin in
#define cout out
#endif
const int nmax = 5e6 + 7;
int v[nmax];
struct MinStacks {
stack<pair<int, int>> stanga, dreapta;
// un element este de forma <numar, minim pe care il avem in stiva sub elementul curent>
void add_element(int index) {
int val = v[index];
if(stanga.empty()) {
stanga.push({val, val});
} else {
stanga.push({val, min(val, stanga.top().second)});
}
}
void remove_element(int index) {
// dar nu avem nevoie de index
if(dreapta.empty()) {
while(!stanga.empty()) {
int val = stanga.top().first;
stanga.pop();
if(dreapta.empty()) {
dreapta.push({val, val});
} else {
dreapta.push({val, min(val, dreapta.top().second)});
}
}
}
dreapta.pop();
}
// analog, trebuie sa facem reverse si cand vrem primul element
// totusi, in problema asta nu avem nevoie de first_element
int get_min() {
if(dreapta.empty() && stanga.empty()) return -1; // nu se intampla
if(dreapta.empty()) return stanga.top().second;
if(stanga.empty()) return dreapta.top().second;
return min(stanga.top().second, dreapta.top().second);
}
};
int main() {
int n, k; cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> v[i];
// initialize the window from [1 ... k]
MinStacks ms;
for(int i = 1; i <= k; i++) {
ms.add_element(i);
}
long long ans = ms.get_min();
for(int i = k + 1; i <= n; i++) {
ms.add_element(i);
ms.remove_element(i - k);
ans += ms.get_min();
}
cout << ans << endl;
}