Cod sursa(job #2475211)

Utilizator radubigColtos Radu radubig Data 16 octombrie 2019 15:41:05
Problema Cuburi2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#define lim 250000

using namespace std;
ifstream in("cuburi2.in");
ofstream out("cuburi2.out");

long long a[lim+5], spst[lim+5], spdr[lim+5], dpst[lim+5], dpdr[lim+5];
int n,m,i,rez,st,dr;

int cb (int l, int r)
{
    int st = l;
    int dr = r;
    int good = l;
    while (st <= dr)
    {
        int mid = (st + dr) / 2;
        if (spst[mid - 1] - spst[l - 1] < spst[r] - spst[mid - 1])
        {
            good = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
  }
  return good;
}

int main()
{
    in>>n>>m;
    for(i=1;i<=n;i++)
    {
        in>>a[i];
        spst[i] = a[i] + spst[i-1];
        dpst[i] = dpst[i-1] + spst[i-1];
    }
    for(i=n; i>=1; i--)
    {
        spdr[i] = a[i] + spdr[i+1];
        dpdr[i] = dpdr[i+1] + spdr[i+1];
    }
    for(i=1;i<=m;i++)
    {
        in>>st>>dr;
        rez = cb(st, dr);
        out<<rez<<' ';
        long long sol;
        sol = dpst[rez] - dpst[st] - (rez - st) * (spst[st - 1]) ;
        sol += dpdr[rez] - dpdr[dr] - (dr - rez) * (spst[n] - spst[dr]);
        out<<sol<<'\n';
    }
    return 0;
}