Pagini recente » Cod sursa (job #512776) | Cod sursa (job #2353903) | Cod sursa (job #530685) | Cod sursa (job #148587) | Cod sursa (job #2763565)
#include "bits/stdc++.h"
#include <cassert>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;
ifstream cin("deque.in");
ofstream cout("deque.out");
int main()
{
stack<pi> s1, s2;
auto get_min = [&]() -> int
{
assert(!(s1.empty() && s2.empty()));
if (s1.empty())
{
return s2.top().second;
}
if (s2.empty())
{
return s1.top().second;
}
return min(s1.top().second, s2.top().second);
};
auto add = [&](const int nr) -> void
{
const int new_min = s1.empty() ? nr : min(nr, s1.top().second);
s1.emplace(nr, new_min);
};
auto remove = [&]() -> void
{
if (s2.empty())
{
while (!s1.empty())
{
const int del_elem = s1.top().first;
s1.pop();
if (s2.empty())
{
s2.emplace(del_elem, del_elem);
}
else
{
s2.emplace(del_elem, min(del_elem, s2.top().second));
}
}
}
s2.pop();
};
int N, K;
::cin >> N >> K;
int i{};
for (int nr; i < K - 1; ::cin >> nr, add(nr), ++i)
;
ll ans{};
for (int nr; i < N; ::cin >> nr, add(nr), ans += get_min(), remove(), ++i)
;
::cout << ans;
}