#include <iostream>
#include <iterator>
#include <cmath>
#include <vector>
#include <tuple>
#include <algorithm>
#include <cstdlib>
#include <fstream>
template <typename T>
auto is_prime (T n) -> auto
{
const auto sqrt_n = static_cast<T> (sqrt (n)); // Тупо отбрасываем дробную часть.
for (auto i = 2; i <= sqrt_n; i++)
if (n % i == 0)
return false;
return true;
}
template <typename T>
auto generate_primes (T val) -> std::vector<std::tuple <T, T>>
{
std::vector <std::tuple <T, T>> result;
const auto limit = static_cast<T> (val / 2); // Тут тоже.
for (auto i = 2; i < limit; i++) { // <=
if (is_prime (i) && is_prime (val-i)) {
result.emplace_back (std::make_tuple (i, val-i));
}
}
return result;
}
template <typename T>
auto generate_evens (const T start, const T end) -> std::vector<T>
{
std::vector<T> result;
for (auto i = start; i <= end; ++i)
result.emplace_back (i);
return result;
}
template <typename T>
auto pass (const T start, const T end) -> T
{
std::vector<T> results;
for (const auto& i : generate_evens (start, end)) {
for (const auto& val : generate_primes (i)) {
// std::cout << i << ": " << std::get<0> (val) << " " << std::get<1> (val) << std::endl; // NOTE: debug only
results.emplace_back (std::get<0> (val));
}
// std::cout << "~~~~~" << std::endl; // NOTE: debug only
}
const auto result = std::max_element (results.begin (), results.end ());
if (result != results.end ())
return *result;
return {};
}
auto read_input () -> std::vector<int>
{
std::ifstream input_file ("input.txt");
std::string line;
std::getline (input_file, line);
input_file.close ();
//const char* input = "11 14";
const char* input = line.c_str ();
char* end;
std::vector<int> args;
for (long i = std::strtol (input, &end, 10); input != end; i = std::strtol (input, &end, 10)) {
args.emplace_back (i);
input = end;
}
return args;
}
auto main () -> int
{
const auto args = read_input ();
if (args.size () < 2)
return 1; // Не хватает данных!
const auto fst = args[0];
const auto snd = args[1];
std::cout << pass<int> (fst, snd);
return 0;
}