Cod sursa(job #466110)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 26 iunie 2010 10:24:45
Problema Fibo3 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.33 kb
#include <cstdio>

#define MAXF 100
#define MAX 2000000000000000

#define FIN "fibo3.in"
#define FOUT "fibo3.out"

long long V[MAXF];

int N;

void calc()
{
    for (V[0] = 4, V[1] = 1, V[2] = 1, V[3] = 2; V[V[0]] <= MAX; ++ V[0])
    {
        V[V[0] - 2] = V[V[0] - 1];

        V[V[0] - 1] = V[V[0] - 2];

        V[V[0]] = V[V[0] - 1] + V[V[0] - 1];
    }

    -- V[0];
}

long long min(long long A, long long B)
{
    return A > B ? A : B;
}

long long bsearch(long long A, long long B)
{
    int i, f, l, m, x1, x2;
    long long R;

    for (f = 1, l = V[0]; f < l;)
    {
        m = (f + l) >> 1;

        if (V[m] >= A)
            l = m;
        else
            f = m + 1;
    }

    x1 = f;

    for (f = 1, l = V[0]; f < l;)
    {
        m = (f + l) >> 1;

        if (V[m] > B)
            l = m - 1;
        else
            f = m;
    }

    x2 = f;

    for (i = x1, R = 0; i <= x2; ++ i)
        R += min(V[i] - A + 1, B - V[i] + 1);

    return R;
}

int main()
{
    int i;
    long long x1, x2, y1, y2;

    freopen(FIN, "r", stdin);
    freopen(FOUT,"w", stdout);

    calc();

    scanf("%d", &N);

    for (i = 1; i <= N; ++ i)
    {
        scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);

        printf("%lld\n", bsearch(x1 + y1, x2 + y2));
    }
}