#include <stdio.h>

long long average(long long a, long long b, long long c)
{
	long long rem_sum = a % 3 + b % 3 + c % 3;
	long long x = a / 3 + b / 3 + c / 3 + rem_sum / 3;
	long long y = rem_sum % 3;

	int coef1 = -(x > 0 && y < 0);
	int coef2 = +(x < 0 && y > 0);

	return x + coef1 + coef2;
}

int main(void)
{
	long long min = -9223372036854775807 - 1;
	long long max = 9223372036854775807;

	printf("%d", average(min, min,   min)   ==  min         );
	printf("%d", average(max, max,   max)   ==  max         );
	printf("%d", average(min, min+1, min+2) ==  min+1       );
	printf("%d", average(max, max-1, max-2) ==  max-1       );
	printf("%d", average(max,  1,     2)    ==  max/3 + 1   );
	printf("%d", average(max, -1,    -2)    ==  max/3 - 1   );
	printf("%d", average(min,  1,     2)    == -(max/3 - 1) );
	printf("%d", average(min, -1,    -2)    == -(max/3 + 1) );
	printf("%d", average(0,    0,     0)    ==  0           );
	printf("%d", average(2,    2,     2)    ==  2           );
	printf("\n");
	
	printf("%d", average(9223372036854775800, 4611686018427387897, 3) == 4611686018427387900);
	printf("%d", average(9223372036854775800, -6, -2) == 3074457345618258597);
	printf("\n");

	long long counter = 0;
	long long first = -32;
	long long last =   32;
	for (long long a = first; a <= last; ++a)
		for (long long b = first; b <= last; ++b)
			for (long long c = first; c <= last; ++c)
			{
				long long res = (a + b + c) / 3;
				if (average(a, b, c) != res)
					++counter;
			}
	printf("Errors: %lld\n", counter);
}
