Pagini recente » Cod sursa (job #1739474) | Cod sursa (job #563126) | Cod sursa (job #778616) | Cod sursa (job #3229377) | Cod sursa (job #3172504)
#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() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
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;
}