Cod sursa(job #964516)

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

using namespace std;

ifstream fin("cuburi2.in");

char parse[1 << 20], *now;
inline void verify()
{
    if (*now == 0)
    {
        fin.get(parse, 1 << 20, '\0');
        now = parse;
    }
}
inline int get()
{
    while (*now < '0' || *now > '9')
    {
        ++now;
        verify();
    }
    int number = 0;
    while (*now >= '0' && *now <= '9')
    {
        number = number * 10 + (*now - '0');
        ++now;
        verify();
    }
    return number;
}

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()
{
    freopen("cuburi2.out", "w", stdout);

	now = parse;
	verify();

    N = get();
    M = get();
    for (int i = 1; i <= N; ++i)
    {
        S[i] = get();
        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)
    {
        val1 = get();
        val2 = get();

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

        printf("%d %lld\n", resnow, value(val1, val2, resnow));
    }

	fin.close();
}