Cod sursa(job #1385928)

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

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

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

inline long long Calc_Val(int st, int dr, int 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()
{
    freopen("cuburi2.out", "w", stdout);
    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];
    }

    int x, y, p, u, mij, sol;
    while (M--)
    {
        x = Get_Num();
        y = Get_Num();
        p = x;
        u = y;

        while (p <= u)
        {
            mij = (p + u) / 2;
            if (V[mij] - V[x - 1] >= V[y] - V[mij])
            {
                sol = mij;
                u = mij - 1;
            }
            else
            {
                p = mij + 1;
            }
        }

        printf("%d %lld\n", sol, Calc_Val(x, y, sol));
    }

    return 0;
}