Cod sursa(job #3319554)

Utilizator Andreea1501013Andreea Andreea1501013 Data 1 noiembrie 2025 20:27:00
Problema Cuburi2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

long long sp[250005],spSp[250005],sum=0,nr,sumInitial[250005],solutie;

/// sp este suma partiala normala pe vectorul dat
///spSp este suma partiala de sume partiale
///sumInitial = 1*v[1] + 2*v[2] + ... + N*v[N]

long long x,y,valFinal;

long long check(long long i)
{
    return (sumInitial[y] -sumInitial[x-1]) - (i*(sp[y]-sp[x-1])- 2* (spSp[i-1] - spSp[x-1]));
    ///formula determinata pt calcularea sumei din cerinta pt o anumita pozitie
}
int main()
{
    ifstream cin("cuburi2.in");
    ofstream cout("cuburi2.out");
    long long N,M;
    cin>>N>>M;

    for(int i=1;i<=N;i++)
    {
        cin>>nr;
        sumInitial[i]= sumInitial[i-1] + i*nr;
        sp[i]= sp[i-1]+nr;
        spSp[i]= spSp[i-1]+sp[i];
    }

    while(M--)
    {
        cin>>x>>y;
        ///caut binar pozitia buna

        valFinal=LONG_MAX;
        long long st=x,dr=y;
        while(st<=dr)
        {
            long long m=(st+dr)/2;
           // cout<<spSp[m-1]<<' '<<spSp[st-1]<<'\n';
            long long val1=check(m);
           // cout<<m<<' '<<val1<<' '<<(sumInitial[dr] -sumInitial[st-1]) - m*(sp[dr]-sp[st-1])<<'\n';
            long long val2=check(m+1);
            if(val1>val2)
            {
                st=m+1;
               // valFinal=val2;
            }
            else
            {
                dr=m-1;
               // valFinal=val1;
            }
            if(val1<valFinal)
            {
                valFinal=val1;
                solutie=m;

            }
        }
        cout<<solutie<<' '<<valFinal<<'\n';
   }
    return 0;
}