Pagini recente » Borderou de evaluare (job #840793) | Cod sursa (job #3345929) | Borderou de evaluare (job #996564) | Cod sursa (job #2118985) | Cod sursa (job #3328778)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#define cin f
#define cout g
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
struct Big {
vector<int> d;
bool neg;
};
void normalize(Big& a) {
while (a.d.size() > 1 && a.d.back() == 0)
a.d.pop_back();
if (a.d.size() == 1 && a.d[0] == 0)
a.neg = false;
}
Big fromLL(long long x) {
Big a;
a.d.clear();
if (x < 0) {
a.neg = true;
x = -x;
}
else {
a.neg = false;
}
if (x == 0) {
a.d.push_back(0);
return a;
}
while (x > 0) {
a.d.push_back(x % 10);
x /= 10;
}
return a;
}
int cmpAbs(const Big& a, const Big& b) {
if (a.d.size() != b.d.size())
return (a.d.size() > b.d.size()) ? 1 : -1;
for (int i = (int)a.d.size() - 1; i >= 0; --i) {
if (a.d[i] != b.d[i])
return (a.d[i] > b.d[i]) ? 1 : -1;
}
return 0;
}
void addAbs(Big& a, const Big& b) {
int carry = 0;
size_t i = 0;
while (i < a.d.size() || i < b.d.size() || carry) {
int sum = carry;
if (i < a.d.size()) sum += a.d[i];
if (i < b.d.size()) sum += b.d[i];
if (i < a.d.size()) a.d[i] = sum % 10;
else a.d.push_back(sum % 10);
carry = sum / 10;
++i;
}
}
void subAbs(Big& a, const Big& b) {
int borrow = 0;
for (size_t i = 0; i < a.d.size(); ++i) {
int x = a.d[i] - borrow - (i < b.d.size() ? b.d[i] : 0);
if (x < 0) {
x += 10;
borrow = 1;
}
else {
borrow = 0;
}
a.d[i] = x;
}
normalize(a);
}
void addBig(Big& a, const Big& b) {
if (a.neg == b.neg) {
addAbs(a, b);
}
else {
int c = cmpAbs(a, b);
if (c == 0) {
a.d.assign(1, 0);
a.neg = false;
}
else if (c > 0) {
subAbs(a, b);
}
else {
Big tmp = b;
subAbs(tmp, a);
a = tmp;
}
}
normalize(a);
}
void addLL(Big& a, long long x) {
Big b = fromLL(x);
addBig(a, b);
}
void printBig(const Big& a) {
if (a.neg && !(a.d.size() == 1 && a.d[0] == 0))
cout << '-';
for (int i = (int)a.d.size() - 1; i >= 0; --i)
cout << a.d[i];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n, k;
cin >> n >> k;
vector<long long> v(n + 1);
for (long long i = 1; i <= n; ++i)
cin >> v[i];
deque<long long> dq;
Big S = fromLL(0);
for (long long i = 1; i <= n; ++i) {
if (!dq.empty() && dq.front() == i - k)
dq.pop_front();
while (!dq.empty() && v[dq.back()] > v[i])
dq.pop_back();
dq.push_back(i);
if (i >= k) {
long long mn = v[dq.front()];
addLL(S, mn);
}
}
printBig(S);
return 0;
}