Cod sursa(job #2475069)

Utilizator AnastasiaStefanescuAnastasia Stefanescu AnastasiaStefanescu Data 16 octombrie 2019 10:23:17
Problema Cuburi2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb

#include <iostream>
#include <fstream>

using namespace std;

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

int n, m, h[250001];
unsigned long long sp_st[250001], sp_dr[250001], cost_st[250001], cost_dr[250001];

int main()
{
    int x, y, i, j, l, st, dr, mijl, poz;
    unsigned long long minim, cost, de_mutat_st, de_mutat_dr;
    
    fin >> n >> m;
    for (i = 1; i<= n; i++)
    {
        fin >> h[i];
        sp_st[i] = sp_st[i-1] + h[i];
        cost_st[i] = cost_st[i-1] + sp_st[i];
    }
    
    for (i = n; i>= 1; i--)
    {
        sp_dr[i] = sp_dr[i+1] + h[i];
        cost_dr[i] = cost_dr[i+1] + sp_dr[i];
    }
    
    for (l = 1; l<= m; l++)
    {
        fin >> x >> y;
        
        st = x;
        dr = y;
        minim = LLONG_MAX;
        poz = x;
        while (st <= dr)
        {
            mijl = (st + dr)/2;
            cost = cost_st[mijl-1] - cost_st[x-1] - sp_st[x-1]*(mijl-x) + cost_dr[mijl+1] - cost_dr[y+1] - sp_dr[y+1]*(y-mijl);
            
            if(sp_st[mijl-1] - sp_st[x-1] < sp_dr[mijl+1] - sp_dr[y+1])
            {//ne ducem in dreapta
                poz = mijl;
                minim = cost;
                st = mijl + 1;
            }
            else
            {
                dr = mijl-1;
            }
        }
        if(minim > cost)
            fout << mijl << " " << cost << '\n';
        else
            fout << poz << " " << minim << '\n';
    }
    return 0;
}