Cod sursa(job #466235)

Utilizator darrenRares Buhai darren Data 26 iunie 2010 12:24:18
Problema Fibo3 Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.23 kb
#include<fstream>
using namespace std;

int n, step;
long long fib[82], sum[82];

long long number(long long x, long long y)
{
	if (x < 0 || y < 0) return 0;
	
	int i, aux;
	long long sum1 = 0, sum2 = 0;
	
	for (i = 80, aux = step; aux; aux >>= 1)
		if (i - aux >= 1 && fib[i - aux] > x + y)
			i -= aux;
	sum1 = sum[i] - (fib[i] - (x + y) - 1) * (i - 1);
	
	for (i = 80, aux = step; aux; aux >>= 1)
		if (i - aux >= 1 && fib[i - aux] > y - 1)
			i -= aux;
	sum2 = sum[i] - (fib[i] - y) * (i - 1);
	sum1 -= sum2;
	
	for (i = 80, aux = step; aux; aux >>= 1)
		if (i - aux >= 1 && fib[i - aux] > x - 1)
			i -= aux;
	sum2 = sum[i] - (fib[i] - x) * (i - 1);
	sum1 -= sum2;
	
	return sum1;
}

int main()
{
	ifstream fin("fibo3.in");
	ofstream fout("fibo3.out");
	
	fib[1] = 1, fib[2] = 2;
	sum[1] = 0, sum[2] = 1;
	for (int i = 3; i <= 80; ++i)
	{
		fib[i] = fib[i - 1] + fib[i - 2];
		sum[i] = sum[i - 1] + (i - 1) * fib[i - 2];
	}
	for (step = 1; step << 1 <= 80; step <<= 1);
	
	fin >> n;
	for (int i = 1; i <= n; ++i)
	{
		long long x_1, x_2, y_1, y_2;
		fin >> x_1 >> y_1 >> x_2 >> y_2;
		fout << number(x_2, y_2) - number(x_1 - 1, y_2) - number(x_2, y_1 - 1) + number(x_1 - 1, y_1 - 1) << '\n';
	}
}