Наибольшая цепь
Определим на двух тройках 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_1 ≺ a_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_i1 ≺ p_i2 ≺ ... ≺ p_ik наибольшая, то ответ равен k.