Cod sursa(job #3328778)

Utilizator Rares_MihaescuRares-Andrei Mihaescu Rares_Mihaescu Data 10 decembrie 2025 12:55:07
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.04 kb
#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;
}