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

Наибольшая цепь

Наибольшая цепь

Лимит времени 60 секунд
Лимит использования памяти 256 MiB

Определим на двух тройках a = (x_a, y_a, z_a) и b = (x_b, y_b, z_b) частичный порядок следующим образом:

a ≺ b x_a < x_b и y_a < y_b и z_a < z_b

По заданному набору троек следует найти наибольшую возрастающую последовательность a_1a_2 ≺ ... ≺ a_k.

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

Состоит из нескольких тестов, каждый из которых содержит набор троек в следующем формате.

m n A B

x_1 y_1 z_1

x_2 y_2 z_2

...

x_m y_m z_m

Первая строка содержит m, n, A и B, все значения x_i, y_i и z_i (i = 1, ..., m) являются неотрицательными целыми.

Каждый тест содержит множество из m + n троек. Тройки от p_1 до p_m задаются в явном виде, i-ая тройка p_i равна (x_i, y_i, z_i). Остальные n троек задаются параметрами A и B и генерируются при помощи следующей процедуры.

int a = A, b = B, C =  (1«31), M = (1«16)-1;

int r() {

a = 36969 * (a M) + (a » 16);

b = 18000 * (b M) + (b » 16);

return (C ((a « 16) + b)) % 1000000;

}

Совершается 3n вызовов r(), каждый из которых генерирует числа x_{m+1}, y_{m+1}, z_{m+1}, x_{m+2}, y_{m+2}, z_{m+2}, ..., x_{m+n}, y_{m+n} и z_{m+n} в указанном порядке.

Считайте, что 1 m + n 3×10^5, 1 A, B 2^16 и 0 x_k, y_k, z_k < 10^6 для 1 k m + n.

Последняя строка содержит четыре нуля. Общая сумма m + n для всех тестов не превосходит 2×10^6.

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

Для каждого теста вывести длину наибольшей возрастающей последовательности троек из заданного множества. Если p_i1p_i2 ≺ ... ≺ p_ik наибольшая, то ответ равен k.

Пример

Входные данные #1
6 0 1 1
0 0 0
0 2 2
1 1 1
2 0 2
2 2 0
2 2 2
5 0 1 1
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
10 0 1 1
3 0 0
2 1 0
2 0 1
1 2 0
1 1 1
1 0 2
0 3 0
0 2 1
0 1 2
0 0 3
0 10 1 1
0 0 0 0
Выходные данные #1
3
5
1
3
Источник ACM International Collegiate Programming Contest, Asia Regional Contest, Aizu, 2013–11–24