#include <iostream>
#include <cmath>

using int_t = long long;
constexpr int_t N = 1000000LL;

inline int sumDigits(int_t n, int dig, int& s)
{
	auto even = !(dig % 2);
	auto sum = 0;
	for (; n; n /= 10, s = -s) sum += s * (n % 10);
	return even ? -sum : sum;
}

inline int sumDigits(int_t n, int dig)
{
	auto s = 1;
	return sumDigits(n, dig, s);
}

inline int_t sub(int dig)
{
	return dig == 1 ? 0 : static_cast<int_t>(std::pow(10.0, dig - 1));
}

inline int_t odd(int_t n, int dig)
{
	return (n - sub(dig)) / 2 + ((n % 2) ? 1 : -sumDigits(n, dig));
}

inline int_t even(int_t n, int dig)
{
	auto sum = 0LL, b = 0LL, z = 1LL, x = (n - sub(dig)) / 10;
	for (auto s = -1; n; n /= 10, s = -s, x /= 10, z *= 10) {
		int d = n % 10;
		sum += s * ((x * 45 + (d * (d - 1) / 2)) * z + d * (b + 1));
		b += d * z;
	}
	return sum;
}

int solve(int_t n)
{
	auto sum = 0LL;
	auto dig = static_cast<int>(std::floor(std::log10(n))) + 1;
	if (dig > 1) sum = 5;
	if (dig > 2) for (int i = 2, a = 45, s = -1; i < dig; ++i, a *= 10, s = -s) sum += a * s;
	return sum + ((dig % 2) ? odd(n, dig) : -even(n, dig));
}

int main()
{
	auto sign = 1;
	auto testsum = 0LL;
	for (auto i = 1LL; i < N; ++i) {
		testsum += sumDigits(i, static_cast<int>(std::floor(std::log10(i))) + 1, sign);
		if (solve(i) != testsum) {
			std::cout << "Error! " << i << ": " << testsum << ", " << solve(i) << std::endl;
			return 1;
		}
	}
}