eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач
Задачи

Сортировка Гильберта

Сортировка Гильберта

Размещение элементов в базах данных в соответствии с числовым ключом не только упрощает поиск определенного элемента, но также позволяет лучше использовать кэш Центрального Процессора: любой сегмент данных смежный в памяти, будет описывать элементы с похожими ключами. Это полезно, если, например, мы хотим получить доступ ко всем элементам, чьи ключи находятся в некотором диапазоне. Все становится сложнее, если ключи представляют собой точки на 2D-сетке, что имеет место в системе GPS-навигации. Если точки (x, y) сортируются сначала по x, а потом по y, то точки, смежные в памяти, будут иметь идентичные x координаты, но не обязательно одинаковые y координаты. Точки с одинаковыми y координатами могут располагаться далеко друг от друга на сетке. Для лучшего сохранения расстояния мы будем сортировать данные по непрерывной кривой, заполняющей пространство.

prb8188.gif

Рассмотрим одну такую кривую заполнения пространства, называемую кривой Гильберта. Кривая Гильберта начинается с начала координат (0, 0) и завершается в (S, 0), в процессе обхода посещая квадрат с углами (0, 0) и (S, S). Она имеет следующую рекурсивную конструкцию: разделим квадрат на четыре с общей точкой (S / 2, S / 2), и рекурсивно заполним каждый из них правильно повернутой и масштабированной копией полной кривой Гильберта. Сначала нижний левый квадрат заполняется кривой, идущей от (0, 0) до (0, S / 2). Затем верхний левый квадрат заполняется от (0, S / 2) до (S / 2, S / 2). Потом верхний правый квадрат заполняется от (S / 2, S / 2) до (S, S / 2). И наконец нижний правый квадрат заполняется от (S, S / 2) до (S, 0). С другой стороны гильбертова кривая может быть построена как математический предел последовательности кривых, первые шесть из которых показаны на рисунке.

Заданные местоположения Вас просят отсортировать в соответствии с посещением их кривой Гильберта. Заметим, что хотя кривая пересекает себя бесконечное число раз, например в точке (S / 2, S / 2), объявление S нечетным гарантирует нам, что все целые точки посещаются только один раз.

Входные данные

Первая строка содержит два целых числа n и S (1n200000, 1S < 109, S нечетно). Далее следуют n строк. Строка i + 1 описывает i-ое место двумя целыми координатами xi и yi (0 ≤ xi, yiS) и названием - строкой из не более чем 46 символов - букв и цифр (A - Z, a - z, 0 - 9). Никакие два места не имеют одинаковых координат или одинаковых названий.

Выходные данные

Выведите n строк - названий мест, каждое в отдельной строке, отсортированных в порядке посещения их кривой Гильберта.

Лимит времени 2 секунды
Лимит использования памяти 128 MiB
Входные данные #1
14 25
5 5 Honolulu
5 10 PugetSound
5 20 Victoria
10 5 Berkeley
10 10 Portland
10 15 Seattle
10 20 Vancouver
15 5 LasVegas
15 10 Sacramento
15 15 Kelowna
15 20 PrinceGeorge
20 5 Phoenix
20 10 SaltLakeCity
20 20 Calgary
Выходные данные #1
Honolulu
Berkeley
Portland
PugetSound
Victoria
Vancouver
Seattle
Kelowna
PrinceGeorge
Calgary
SaltLakeCity
Sacramento
LasVegas
Phoenix
Источник 2015 ACM North America - Pacific Northwest, Дивизион 1, Задача H