#include <cmath>
#include <utility>
#include <iostream>
#include <queue>
#include <vector>
using coordinate = std::pair<double, double>;
std::ostream& operator<<(std::ostream& os, const coordinate& c)
{
os << "(" << c.first << "," << c.second << ")";
return os;
}
double absolute_value(const coordinate& c)
{
const double sum_of_square
= c.first * c.first
+ c.second * c.second;
return std::sqrt(sum_of_square);
}
class comparison_by_absolute_value {
public:
bool operator()(
const coordinate & lhs,
const coordinate & rhs) const;
};
bool comparison_by_absolute_value::operator()(
const coordinate & lhs,
const coordinate & rhs) const
{
return absolute_value(lhs) < absolute_value(rhs);
}
using coordinate_queue = std::priority_queue<
coordinate,
std::vector<coordinate>,
comparison_by_absolute_value>;
int main()
{
coordinate_queue pq;
pq.emplace(3, 1);
pq.emplace(4, 1);
pq.emplace(5, 9);
pq.emplace(2, 6);
pq.emplace(5, 3);
while (!pq.empty())
{
std::cout << pq.top() << std::endl;
pq.pop();
}
return 0;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBjb29yZGluYXRlID0gc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPjsKCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBjb29yZGluYXRlJiBjKQp7CiAgICBvcyA8PCAiKCIgPDwgYy5maXJzdCA8PCAiLCIgPDwgYy5zZWNvbmQgPDwgIikiOwogICAgcmV0dXJuIG9zOwp9Cgpkb3VibGUgYWJzb2x1dGVfdmFsdWUoY29uc3QgY29vcmRpbmF0ZSYgYykKewogICAgY29uc3QgZG91YmxlIHN1bV9vZl9zcXVhcmUKICAgICAgICA9IGMuZmlyc3QgKiBjLmZpcnN0CiAgICAgICAgKyBjLnNlY29uZCAqIGMuc2Vjb25kOwogICAgcmV0dXJuIHN0ZDo6c3FydChzdW1fb2Zfc3F1YXJlKTsKfQpjbGFzcyBjb21wYXJpc29uX2J5X2Fic29sdXRlX3ZhbHVlICB7CnB1YmxpYzoKICAgIGJvb2wgb3BlcmF0b3IoKSgKICAgICAgICBjb25zdCBjb29yZGluYXRlICYgbGhzLAogICAgICAgIGNvbnN0IGNvb3JkaW5hdGUgJiByaHMpIGNvbnN0Owp9OwoKYm9vbCBjb21wYXJpc29uX2J5X2Fic29sdXRlX3ZhbHVlOjpvcGVyYXRvcigpKAogICAgY29uc3QgY29vcmRpbmF0ZSAmIGxocywKICAgIGNvbnN0IGNvb3JkaW5hdGUgJiByaHMpIGNvbnN0CnsKICAgIHJldHVybiBhYnNvbHV0ZV92YWx1ZShsaHMpIDwgYWJzb2x1dGVfdmFsdWUocmhzKTsKfQoKdXNpbmcgY29vcmRpbmF0ZV9xdWV1ZSA9IHN0ZDo6cHJpb3JpdHlfcXVldWU8CiAgICBjb29yZGluYXRlLCAKICAgIHN0ZDo6dmVjdG9yPGNvb3JkaW5hdGU+LCAKICAgIGNvbXBhcmlzb25fYnlfYWJzb2x1dGVfdmFsdWU+OwoKaW50IG1haW4oKQp7CiAgICBjb29yZGluYXRlX3F1ZXVlIHBxOwogICAgcHEuZW1wbGFjZSgzLCAxKTsKICAgIHBxLmVtcGxhY2UoNCwgMSk7CiAgICBwcS5lbXBsYWNlKDUsIDkpOwogICAgcHEuZW1wbGFjZSgyLCA2KTsKICAgIHBxLmVtcGxhY2UoNSwgMyk7CiAgICB3aGlsZSAoIXBxLmVtcHR5KCkpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHBxLnRvcCgpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBwcS5wb3AoKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoK