Pagini recente » Cod sursa (job #2417127) | Cod sursa (job #2737581) | Cod sursa (job #3242788) | Cod sursa (job #811088) | Cod sursa (job #466397)
Cod sursa(job #466397)
#include<cstdio>
#include<algorithm>
using namespace std;
long long v[1000];
long long t=1000000000;
void genFibo() // fa preprocesare...mult mai rapid
{
int i=2;
v[0]=1; v[1]=1;
while(v[i-1]<t) // ai grija este micsorata pt. debug constanta
{
v[i]=v[i-1]+v[i-2];
++i;
}
}
long long calc(long long x1, long long y1, long long x2, long long y2) // cautare binara mai rapid
{
long long i, p1, p2, sum=0, l, poz;
for(i=1; v[i]<y1+x1; ++i);
p1=i;
for(i=p1; v[i]<=y2+x1; ++i);
p2=i-1;
l=v[p1]-y1;
poz=x1;
while(1)
{
if(poz+v[p1+1]-v[p1]+l>x2)
{
sum+=(x2-poz+1)*(p2-p1+1);
break;
}
else
{
sum+=(p2-p1+1)*(v[p1+1]-v[p1]+l);
l=0;
++p1;
poz+=(v[p1+1]-v[p1]+l);
for(i=1; v[i]<=y2+poz; ++i);
p2=i;
}
}
return sum;
}
int main()
{
long long n, x1, y1, x2, y2, i;
freopen("fibo3.in", "rt", stdin);
freopen("fibo3.out", "wt", stdout);
scanf("%lld", &n);
for(i=1; i<=6; ++i)
t*=10;
genFibo();
for(i=1; i<=n; ++i)
{
scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
printf("%lld\n", calc(x1, y1, x2, y2));
}
return 0;
}