Cod sursa(job #3342322)

Utilizator MihneaStoicaMihnea Teodor Stoica MihneaStoica Data 23 februarie 2026 19:00:58
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 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, q;
    cin >> n >> q;

    vector<int> a(n + 1), ps(n + 1), psi(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        ps[i] = ps[i - 1] + a[i];
        psi[i] = psi[i - 1] + i * a[i];
    }

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

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

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

        int tot = sw(l, r);
        if (tot == 0) {
            cout << l << ' ' << 0 << '\n';
            continue;
        }

        int k = tot / 2 + 1;
        int t = ps[l - 1] + k;

        int p = int(lower_bound(ps.begin() + l, ps.begin() + r + 1, t) - ps.begin());

        int lw = sw(l, p - 1);
        int liw = siw(l, p - 1);
        int rw = sw(p + 1, r);
        int riw = siw(p + 1, r);

        int ans = p * lw - liw + riw - p * rw;
        cout << p << ' ' << ans << '\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;
}