Найбільший ланцюг#6784

Найбільший ланцюг

60 секунд
256 мегабайтів
Дуже легка

Визначимо частковий порядок на трійках \mathbf{a} = (x_a, y_a, z_a) та \mathbf{b} = (x_b, y_b, z_b) таким чином:

\mathbf{a} \prec \mathbf{b}, якщо x_a < x_b, y_a < y_b та z_a < z_b.

Дано набір трійок; знайдіть довжину найдовшої строго зростаючої послідовності трійок \mathbf{a}_1 \prec \mathbf{a}_2 \prec \dotsb \prec \mathbf{a}_k.

Вхідні дані

Вхід складається з кількох наборів даних. Кожен набір описує набір трійок у такому форматі:

  • m~n~A~B

  • x_1~y_1~z_1

  • x_2~y_2~z_2

  • x_m~y_m~z_m

Перший рядок містить чотири цілі числа: , , , . Всі значення x_i, y_i, z_i (1 \le i \le m) — невід'ємні цілі числа.

Кожен набір містить m + n трійок. Перші трійок \mathbf{p}_1 до \mathbf{p}_m задані явно (\mathbf{p}_i = (x_i, y_i, z_i)). Решта трійок генеруються так, використовуючи параметри та :

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;
}

Викликайте всього разів, щоб послідовно згенерувати:

x_{m+1},~y_{m+1},~z_{m+1},~x_{m+2},~y_{m+2},~z_{m+2},~\dotsc,~x_{m+n},~y_{m+n},~z_{m+n}.

Ви можете вважати:

1 \le m+n \le 3 \times 10^5,\\ 1 \le A,~B \le 2^{16},\\ 0 \le x_k,~y_k,~z_k < 10^6\quad \text{для}\ 1 \le k \le m+n.

Вхід закінчується рядком з чотирма нулями.

Сума m+n по всіх наборах не перевищує 2 \times 10^6.

Вихідні дані

Для кожного набору виведіть довжину найдовшої строго зростаючої послідовності трійок з цього набору — тобто найбільше таке, що \mathbf{p}_{i_1} \prec \mathbf{p}_{i_2} \prec \dotsb \prec \mathbf{p}_{i_k}.

Приклади

Приклад 1

Loading
Loading