Cod sursa(job #2862560)

Utilizator mateitudordmDumitru Matei mateitudordm Data 5 martie 2022 15:22:24
Problema Cuburi2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#define nmax 250000
#define int long long

using namespace std;

const int inf = 1e17;
int v[nmax + 1], st[nmax + 1], sp[nmax + 1], dr[nmax + 1];

signed main()
{
    ifstream cin ("cuburi2.in");
    ofstream cout ("cuburi2.out");
    int n, m, i, q, a, b, j, act, tot, stt, drr, mij, sol, poz, minn;
    cin >> n >> m;
    for (i = 1; i <= n; i++)
        cin >> v[i], sp[i] = sp[i - 1] + v[i];
    st[1] = v[1];
    for (i = 2; i <= n; i++)
        st[i] = st[i - 1] + sp[i];
    dr[n] = v[n];
    for (i = n - 1; i >= 1; i--)
        dr[i] = dr[i + 1] + (sp[n] - sp[i - 1]);
    for (i = 1; i <= m; i++)
    {
        cin >> a >> b;
        tot = sp[b] - sp[a - 1];
        stt = a, drr = b, sol = a;
        minn = inf;
        while (stt <= drr)
        {
            mij = (stt + drr) / 2;
            if (sp[mij] - sp[a - 1] >= tot / 2)
                sol = mij, drr = mij - 1;
            else
                stt = mij + 1;
        }
        for (j = max (sol - 10, a); j <= min (sol + 10, b); j++)
        {
            act = st[j - 1] - st[a - 1] - (j - a) * sp[a - 1] + dr[j + 1] - (b - j) * (sp[n] - sp[b]) - dr[b + 1];
            if (act < minn)
                minn = act, poz = j;
        }
        cout << poz << " " << minn << '\n';
    }
    return 0;
}