Cod sursa(job #1844915)

Utilizator antanaAntonia Boca antana Data 10 ianuarie 2017 17:17:43
Problema Fibo3 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>

#define MAXFIB 90
#define MAXNR (2e15)

using namespace std;

long long fib[MAXFIB];

inline long long minim(long long a, long long b){
    return (a < b ? a : b);
}

inline long long maxim(long long a, long long b){
    return (a > b ? a : b);
}

int binarySearch(long long val)
{
    int step, ans = 0;

    for(step=(1<<6); step>=1; step>>=1)
        if(fib[ans + step] < val)
            ans += step;

    return ans+1;
}

int main()
{
    freopen("fibo3.in", "r", stdin);
    freopen("fibo3.out", "w", stdout);

    int q, i, pos1, pos2;
    long long x1, y1, x2, y2, ans = 0;

    scanf("%d", &q);

    fib[1] = 1;
    fib[2] = 2;

    i = 2;
    while(fib[i] + fib[i-1] <= MAXNR)
    {
        fib[i+1] = fib[i] + fib[i-1];
        ++i;
    }

    while(q--)
    {
        ans = 0;
        scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);

        pos1 = binarySearch(x1+y1);
        pos2 = binarySearch(x2+y2+1)-1;

        for(i=pos1; i<=pos2; ++i)
            ans += minim(x2, fib[i]-y1) - maxim(x1, fib[i]-y2) + 1;

        printf("%lld\n", ans);
    }

    return 0;
}