Сортування Гільберта#8188

Сортування Гільберта

1 секунда
128 мегабайтів
Легка

Розміщення елементів у базах даних відповідно до числового ключа не лише спрощує пошук конкретного елемента, але й сприяє ефективнішому використанню кешу центрального процесора: будь-який неперервний сегмент пам'яті містить елементи з близькими значеннями ключів. Це особливо корисно, наприклад, при доступі до всіх елементів, ключі яких лежать у заданому діапазоні.

Ситуація ускладнюється, якщо ключі являють собою точки на двовимірній сітці, як це відбувається, наприклад, у системах GPS-навігації. Якщо точки сортувати спочатку за , а потім за , то елементи, розташовані поруч у пам'яті, матимуть однакові значення , але можуть суттєво відрізнятися за . Водночас точки з однаковими значеннями можуть знаходитися далеко одна від одної на площині. Для кращого збереження просторової локальності дані сортують вздовж неперервної кривої, що заповнює простір.

Розглянемо одну з таких кривих — криву Гільберта. Вона починається в точці і закінчується в , проходячи через усі точки квадрата з вершинами та (S, S). Крива будується рекурсивно таким чином: квадрат ділиться на чотири рівні частини зі спільною точкою (S/2, S/2), після чого кожна частина заповнюється зменшеною і відповідним чином повернутою копією повної кривої Гільберта.

Спочатку заповнюється нижній лівий квадрат — крива проходить від до (0, S/2). Потім заповнюється верхній лівий квадрат — від (0, S/2) до (S/2, S/2). Після цього обробляється верхній правий квадрат — від (S/2, S/2) до (S, S/2). Нарешті, заповнюється нижній правий квадрат — від (S, S/2) до .

З іншого боку, криву Гільберта можна розглядати як граничний об'єкт послідовності ламаних, перші кілька з яких показані на рисунку.

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

Вхідні дані

Перший рядок містить два цілих числа і S~(1 \le n \le 200000, 1 \le S < 10^9, S — непарне). Далі йдуть рядків. Рядок i + 1 містить опис -ї точки: два цілих числа x_i і y_i~(0 \le x_i, y_i \le S) та назву — рядок довжиною не більше символів, що складається з букв і цифр (–, –, –). Жодні дві точки не мають однакових координат або однакових назв.

Вихідні дані

Виведіть рядків — назви точок, кожну в окремому рядку, впорядковані відповідно до порядку їх відвідування кривою Гільберта.

Приклади

Приклад 1

Loading
Loading