Cod sursa(job #1385882)

Utilizator zombacDica Razvan zombac Data 12 martie 2015 15:29:07
Problema Cuburi2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#define DIM 8192
#define Max_Size 250010
using namespace std;
ifstream fin ("cuburi2.in");
ofstream fout ("cuburi2.out");
long long N, M, V[Max_Size], ST[Max_Size], DR[Max_Size];
char P[DIM+16], *now;

void Verify()
{
    if (*now == '\0')
    {
        fin.get(P, DIM, '\0');
        now = P;
    }
}

long long Get_Num()
{
    while (*now < '0' || *now > '9')
    {
        now++;
        Verify();
    }
    long long number = 0;
    while (*now >= '0' && *now <= '9')
    {
        number = number * 10 + *now - '0';
        now++;
        Verify();
    }
    return number;
}

long long Calc_Val(long long st, long long dr, long long midle)
{
    long long v_left = ST[midle - 1] - ST[st - 1] - (V[st - 1] * (midle - st));
    long long v_right = DR[midle + 1] - DR[dr + 1] - ((V[N] - V[dr]) * (dr - midle));
    return v_left + v_right;
}

int main()
{
    now = P;
    Verify();
    N = Get_Num();
    M = Get_Num();
    for (int i = 1; i <= N; i++)
    {
        V[i] = Get_Num();
        V[i] = V[i] + V[i-1];
    }

    for (int i = 1; i <= N; i++) {
        ST[i] = ST[i-1] + V[i];
    }

    for (int i = N; i >= 1; i--) {
        DR[i] = DR[i+1] + V[N] - V[i-1];
    }

    for (int i = 1; i <= M; i++)
    {
        long long x, y, p, u, mij, sol;
        x = Get_Num();
        y = Get_Num();
        p = x;
        u = y;

        while (p <= u)
        {
            mij = (p + u) / 2;
            if (Calc_Val(x, y, mij) <= Calc_Val(x, y, mij + 1))
            {
                sol = mij;
                u = mij - 1;
            }
            else
            {
                p = mij + 1;
            }
        }

        fout << sol << ' ' << Calc_Val(x, y, sol) << '\n';
    }

    fout.close();
    return 0;
}