Cod sursa(job #2843353)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 2 februarie 2022 12:46:58
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("cuburi2.in");
ofstream out("cuburi2.out");

long long n,m,sp[250005],v2[250005],v1[250005],a[250005];

long long S(int p,int x,int y)
{
    if (p > y)
        return 1000000000000000000;
    long long s1,s2,s;
    s1 = v1[x] - v1[p] - 1ll * (n - p + 1) * (sp[p - 1] - sp[x - 1]);
    s2 = v2[y] - v2[p] - 1ll * p * (sp[y] - sp[p]);
    s = s1 + s2;
    return s;
}

int main()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int x;
        in >> x;
        a[i] = x;
        sp[i] = sp[i - 1] + x;
        v2[i] = v2[i - 1] + 1ll * x * i;
    }
    for (int i = n; i >= 1; i--)
        v1[i] = v1[i + 1] + 1ll * a[i] * (n - i + 1);
    for (int i = 1; i <= m; i++)
    {
        int x,y;
        in >> x >> y;
        int p = x,pas = 1 << 18;
        while (pas != 0)
        {
            if (p + pas <= y and sp[p + pas] - sp[x - 1] <= sp[y] - sp[p + pas])
                p += pas;
            pas /= 2;
        }
        long long s1 = S(p,x,y),s2 = S(p + 1,x,y);
        if (s1 < s2)
            out << p << ' ' << s1 << '\n';
        else
            out <<  p + 1 << ' ' << s2 << '\n';
    }
    return 0;
}

///la cb,ma uit ca sp[bucata din stanga] < sp[bucata din dreapta]