Cod sursa(job #964510)

Utilizator darrenRares Buhai darren Data 21 iunie 2013 11:36:29
Problema Cuburi2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>

using namespace std;

int N, M;
long long S[250002], S1[250002], S2[250002];

long long value(int i1, int i2, int pos)
{
    long long addleft = S1[pos - 1] - S1[i1 - 1] - (pos - i1) * S[i1 - 1];
    long long addright = S2[pos + 1] - S2[i2 + 1] - (i2 - pos) * (S[N] - S[i2]);
    return addleft + addright;
}

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

    fin >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        fin >> S[i];
        S[i] += S[i - 1];
    }
    for (int i = 1; i <= N; ++i)
        S1[i] = S1[i - 1] + S[i];
    for (int i = N; i >= 1; --i)
        S2[i] = S2[i + 1] + (S[N] - S[i - 1]);

    for (int i = 1, val1, val2; i <= M; ++i)
    {
        fin >> val1 >> val2;

        int step, resnow;
        for (step = 1; step <= (val2 - val1 + 1); step <<= 1);
        for (resnow = val1; step; step >>= 1)
            if (resnow + step <= val2 && value(val1, val2, resnow + step - 1) > value(val1, val2, resnow + step))
                resnow += step;

        fout << resnow << ' ' << value(val1, val2, resnow) << '\n';
    }

	fin.close();
	fout.close();
}