func_code_string: #include <bits/stdc++.h>   using namespace std;   const bool debug = false;   const int maxn = 1002003;   const long long magic = 1000 * 1000 * 1000 + 7;   int n, k;   long long aa[maxn];   struct RMQ {     int l, r;     RMQ *left, *right;     long long res;     int resIndex;   };   RMQ* build(long long* vs, int l, int r) {     RMQ* res = new RMQ();     res->l = l;     res->r = r;     if (r - l >= 2) {       int m = (l + r) / 2;       res->left = build(vs, l, m);       res->right = build(vs, m, r);       if (res->left->res >= res->right->res) {         res->res = res->left->res;         res->resIndex = res->left->resIndex;       } else {         res->res = res->right->res;         res->resIndex = res->right->resIndex;       }     } else {       res->left = nullptr;       res->right = nullptr;       res->res = vs[l];       res->resIndex = l;     }     return res;   }   pair<long long, int> rmqGet(RMQ* q, int l, int r) {     if (q->r <= l || r <= q->l) return make_pair(-100, -1);     if (l <= q->l && q->r <= r) return make_pair(q->res, q->resIndex);     auto [res1, res1index] = rmqGet(q->left, l, r);     auto [res2, res2index] = rmqGet(q->right, l, r);     if (res1 >= res2)       return make_pair(res1, res1index);     else       return make_pair(res2, res2index);   }   int ls[maxn];   int rs[maxn];   RMQ* rmq;   void findLR(int l, int r) {     if (debug) cout <<  findLR:   << l <<     << r << endl;     if (r - l < 2) return;     auto [res, resIndex] = rmqGet(rmq, l + 1, r);     if (debug)       cout <<  rmqGet:   << (l + 1) <<     << r <<     << res <<     << resIndex            << endl;     ls[resIndex] = l;     rs[resIndex] = r;     findLR(l, resIndex);     findLR(resIndex, r);   }   long long countLen(int len) {     if (len < k) return 0;     int rest = len - k;     long long count = rest / (k - 1);     long long res =         (len + 1) * (count + 1) - (count + 1) * (k + k + count * (k - 1)) / 2;     return res;   }   long long countIndex(int i) {     int len = rs[i] - (ls[i] + 1);     long long res =         countLen(len) - countLen(i - (ls[i] + 1)) - countLen(rs[i] - (i + 1));     if (debug) cout <<  countIndex:   << i <<     << res << endl;     return res;   }   int main() {     ios::sync_with_stdio(false);     cin >> n >> k;     for (int i = 1; i <= n; i++) cin >> aa[i];     aa[0] = aa[n + 1] = 1200ll * 1000 * 1000;     rmq = build(aa, 0, n + 2);     findLR(0, n + 1);     if (debug)       for (int i = 1; i <= n; i++) cout << ls[i] <<     << rs[i] << endl;     long long res = 0;     for (int i = 1; i <= n; i++) {       long long c = countIndex(i) % magic;       res = (res + aa[i] * c) % magic;     }     cout << res << endl;     if (debug)       for (int i = 0; i <= 20; i++)         cout <<  len:   << i <<  :   << countLen(i) << endl;     return 0;   }   