Cod sursa(job #3342318)

Utilizator MihneaStoicaMihnea Teodor Stoica MihneaStoica Data 23 februarie 2026 18:54:44
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;

#if 1
#define int ll
#define uint ull
#endif

/**
 * Problem: Cuburi2
 * URL: https://www.infoarena.ro/problema/cuburi2
 * TL: 375 ms
 * ML: 20 MB
 *
 * Good Luck!
 */

void preinit() {
}

void tc() {
    int n, m;
    cin >> n >> m;

    vector<int> h(n + 1), prefW(n + 1), prefIW(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> h[i];
        prefW[i] = prefW[i - 1] + h[i];
        prefIW[i] = prefIW[i - 1] + 1LL * i * h[i];
    }

    auto rangeW = [&](int l, int r) -> int {
        if (l > r) return 0;
        return prefW[r] - prefW[l - 1];
    };

    auto rangeIW = [&](int l, int r) -> int {
        if (l > r) return 0;
        return prefIW[r] - prefIW[l - 1];
    };

    while (m--) {
        int l, r;
        cin >> l >> r;

        int total = rangeW(l, r);
        int need = total / 2 + 1;
        int target = prefW[l - 1] + need;

        int p =
            int(lower_bound(prefW.begin() + l, prefW.begin() + r + 1, target) -
                prefW.begin());

        int leftW = rangeW(l, p - 1);
        int leftIW = rangeIW(l, p - 1);
        int rightW = rangeW(p + 1, r);
        int rightIW = rangeIW(p + 1, r);

        int cost = 1LL * p * leftW - leftIW + rightIW - 1LL * p * rightW;
        cout << p << ' ' << cost << '\n';
    }
}

#define MTC 0
#define FIO 1
#define FN "cuburi2"

signed main() {
#if FIO == 1 && !defined(LOCAL)
    (void)freopen(FN ".in", "r", stdin);
    (void)freopen(FN ".out", "w", stdout);
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    preinit();
#if MTC == 1
    signed tt;
    cin >> tt;
    while (tt--) tc();
#else
    tc();
#endif
    return 0;
}