OI XXXI - cia

// https://szkopul.edu.pl/problemset/problem/q6f5K7O79TpYR7yuZVrQpy_d/site/?key=statement

#include <bits/stdc++.h>

// using namespace std;

// #define GARY_DBG
#define GARY_LIB

#define int long long

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

struct Wavelet {
    int lo, hi;
    std::vector<int> b; // b[i] = # elements among first i that go to left child
    std::vector<int> pref; // pref sum of first i elements (their original values)
    std::vector<int> leftPref; // pref sum of elements that went left among first i
    Wavelet *L = nullptr, *R = nullptr;
    const std::vector<int>* valsPtr; // pointer to sorted-unique values by rank

    // data: std::vector of ranks (0..m-1) for this node's subsequence
    Wavelet(const std::vector<int>& data, const std::vector<int>& vals, int loIdx, int hiIdx) : lo(loIdx), hi(hiIdx) {
        valsPtr = &vals;
        int n = data.size();
        b.assign(n + 1, 0);
        pref.assign(n + 1, 0);
        leftPref.assign(n + 1, 0);
        if (n == 0) return;
        if (lo == hi) {
            // leaf: all elements have same value = vals[lo]
            for (int i = 0; i < n; ++i) {
                pref[i + 1] = pref[i] + (*valsPtr)[data[i]];
                leftPref[i + 1] = leftPref[i] + (*valsPtr)[data[i]];
                b[i + 1] = b[i] + 1; // everything goes to "left" in leaf representation (not used deeply)
            }
            return;
        }
        int mid = (lo + hi) >> 1;
        std::vector<int> leftData;
        leftData.reserve(n);
        std::vector<int> rightData;
        rightData.reserve(n);
        for (int i = 0; i < n; ++i) {
            int rank = data[i];
            pref[i + 1] = pref[i] + (*valsPtr)[rank];
            if (rank <= mid) {
                b[i + 1] = b[i] + 1;
                leftPref[i + 1] = leftPref[i] + (*valsPtr)[rank];
                leftData.push_back(rank);
            } else {
                b[i + 1] = b[i];
                leftPref[i + 1] = leftPref[i];
                rightData.push_back(rank);
            }
        }
        if (!leftData.empty()) L = new Wavelet(leftData, vals, lo, mid);
        if (!rightData.empty()) R = new Wavelet(rightData, vals, mid + 1, hi);
    }

    // query: sum of k largest numbers in interval [l,r] (1-indexed indices into this node's sequence)
    int sum_k_largest(int l, int r, int k) {
        if (l > r || k <= 0) return 0LL;
        int len = r - l + 1;
        if (k >= len) {
            // take all elements sum
            return pref[r] - pref[l - 1];
        }
        if (lo == hi) {
            // all values equal to vals[lo]
            return (int)k * (*valsPtr)[lo];
        }
        // number of elements that went to right child in [l,r]
        int leftCount = b[r] - b[l - 1];
        int rightCount = len - leftCount;

        if (rightCount >= k) {
            // we can take all k from right subtree
            int newL = l - b[l - 1];
            int newR = r - b[r];
            return R->sum_k_largest(newL, newR, k);
        } else {
            // take everything from right subtree, plus (k - rightCount) from left subtree
            int totalRangeSum = pref[r] - pref[l - 1];
            int leftRangeSum = leftPref[r] - leftPref[l - 1];
            int rightRangeSum = totalRangeSum - leftRangeSum;
            // mapping to left child indices:
            int newL = b[l - 1] + 1;
            int newR = b[r];
            return rightRangeSum + L->sum_k_largest(newL, newR, k - rightCount);
        }
    }
};

int d[sizik], pref[sizik];

void solve() {
    int n, q;
    std::cin >> n >> q;

    std::vector<int> vals;
    for (int i = 1; i <= n; i++) {
        std::cin >> d[i];
        if (i & 1)
            vals.push_back(d[i]);
        else
            vals.push_back(0);

        pref[i] = pref[i - 1] + d[i];
    }

    assert(pref[0] == 0);

    std::sort(vals.begin(), vals.end());
    vals.erase(std::unique(vals.begin(), vals.end()), vals.end());
    int m = (int)vals.size();
    std::vector<int> ranks(n);
    std::unordered_map<int, int> mp;
    mp.reserve(2 * m);
    for (int i = 0; i < m; i++) {
        mp[vals[i]] = i;
    }
    for (int i = 0; i < n; i++) {
        int x = d[i + 1];
        if (i & 1) x = 0;
        ranks[i] = mp[x];
    }

    // magic !
    Wavelet wt(ranks, vals, 0, m - 1);

    for (; q > 0; q--) {
        int l, r, k;
        std::cin >> l >> r >> k;

        auto l_ptr = std::lower_bound(pref, pref + n + 1, l);
        l_ptr++;

        auto r_ptr = std::lower_bound(pref, pref + n + 1, r);
        r_ptr--;

        int l_idx = std::distance(pref, l_ptr);
        int r_idx = std::distance(pref, r_ptr);

        if (l_ptr > r_ptr) {
            int x = std::distance(pref, l_ptr - 1);
            int y = std::distance(pref, r_ptr + 1);
            if ((x & 1) != (y & 1)) {
                if (k < 1) {
                    std::cout << "0\n";
                } else if (x & 1) {
                    l_ptr--;
                    int z = *l_ptr - l + 1;
                    std::cout << z << '\n';
                } else {
                    int z = r - (*r_ptr + 1) + 1;
                    std::cout << z << '\n';
                }
            } else if (x & 1) {
                std::cout << r - l + 1 << '\n';
            } else {
                std::cout << 0 << '\n';
            }

            continue;
        }

        if (k == 0) {
            std::cout << "0\n";
            continue;
        }

        int l1 = l_idx;
        int r1 = r_idx;

        int x1 = (pref[l_idx - 1] - l + 1);
        int x2 = (r - pref[r_idx]);

        if ((std::distance(pref, l_ptr) & 1)) {
            x1 = 0;
        }

        if ((std::distance(pref, r_ptr) & 1)) {
            x2 = 0;
        }

        int ans = 0;
        int seglen = r1 - l1 + 1;

        auto gg_k = [&](int k1) -> int {
            if (k1 > seglen) return seglen;
            return k1;
        };

        int k_prime = gg_k(k / 2);
        int wyn = wt.sum_k_largest(l1, r1, k_prime);
        ans = std::max(ans, wyn);

        if (k >= 1) {
            k_prime = gg_k((k - 1) / 2);
            wyn = wt.sum_k_largest(l1, r1, k_prime);
            wyn += std::max(x1, x2);
            ans = std::max(ans, wyn);
        }

        if (k >= 2) {
            k_prime = gg_k((k - 2) / 2);
            wyn = wt.sum_k_largest(l1, r1, k_prime);
            wyn += x1 + x2;
            ans = std::max(ans, wyn);
        }

        std::cout << ans << '\n';
    }
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}