loj#P3260. 「ROIR 2020 Day1」机器人锦标赛

「ROIR 2020 Day1」机器人锦标赛

题目描述

译自 ROIR 2020 Day1 T4. Олимпиада для роботов

机器人高速布尔函数计算锦标赛的任务由评委会准备。

机器人的一个任务是一张 mmnn 列的表格,其中每个格子有一个整数权值,且记第 iijj 列的格子的权值为 xi,jx_{i,j}
对于每一列,该列中所有格子的权值组成了一个 0m10\ldots m-1 的排列。换句话说,每列中所有格子的权值互不相同:
iki \ne k,则对于所有的 jjxi,jxk,jx_{i,j} \ne x_{k,j},且有 0xi,j<m0 \le x_{i,j} < m

对于每一列,评委会设置了一个阈值 —— 一个在 [0,m][0,m] 内的非负整数 zjz_j。你需要以所有形如 xi,j<zjx_{i,j} < z_j 的逻辑表达式的值为参数计算布尔函数的值。一个逻辑表达式的值为 11 当且仅当这个表达式成立,否则为 00

在比赛中,选手们需要计算 mm 个布尔函数的值 —— 对每一行计算一次。每个布尔函数以一个非重复单调线性规划(NMLP)定义。

考虑第 ii 行的 NMLP。
这是由 n1n-1 条以 1n11 \ldots n-1 编号的指令组成的一个序列,第 pp 条指令给定三个数:ap,bp,oppa_p, b_p, op_poppop_p 只有两种取值:11 表示与运算,22 表示或运算。
ap,bpa_p,b_p 则是第 pp 个指令的参数,满足 1ap,bp<n+p1 \le a_p,b_p < n+p

考虑一个仅包含 0011 的数组 val[12n1]val[1\ldots 2n-1]。对于 1jn1 \le j \le nval[j]=[xi,j<zj]val[j] = [x_{i,j} < z_j],其中 [P][P] 表示表达式 PP 的值。
val[n+p]val[n+p] 的值通过第 pp 条指令计算。

  • 对于 opp=1op_p = 1val[n+p]=(val[ap] and val[bp])val[n+p] = (val[a_p]\ \texttt{and}\ val[b_p])
  • 对于 opp=2op_p = 2val[n+p]=(val[ap] or val[bp])val[n+p] = (val[a_p]\ \texttt{or}\ val[b_p])

该规划是非重复的,也就是说,对于 p=1n1p = 1\ldots n-1,所有 2n22n-2ap,bpa_p,b_p 的值互不相同。

程序执行的结果即为 val[2n1]val[2n-1]

目前评委会已经准备好了所有的 xi,jx_{i,j},需要由你来确定每一列的阈值才能完整地准备这个任务。
评委会认为一个任务是平衡的,当且仅当所有 mm 行中恰有 ss 行的布尔函数最后得到的结果为 11,其余 msm-s 行得到 00
你的任务即为替评委会找到合适的阈值。

对于此题,可以证明一定存在至少一种选择阈值的方案满足上述条件。

输入格式

第一行,三个整数 n,m,sn,m,s
以下 m(n1)m(n-1) 行,第 i(n1)+p  (1pn1)i \cdot (n-1) + p\;(1 \le p \le n-1) 行包含三个整数 ap,bp,oppa_p,b_p,op_p,表示第 ii 行的第 pp 个操作。
以下 mm 行,每行 nn 个整数,表示所有的 xi,jx_{i,j}

输出格式

输出 nn 个整数 z1,z2,,zn  (0zjm)z_1, z_2, \ldots, z_n\;(0 \le z_j \le m)
如有多解,任意输出一个即可。

4 3 2
1 2 1
3 4 1
5 6 2
1 2 2
3 5 1
4 6 2
1 4 1
2 3 1
5 6 2
0 1 2 2
2 2 1 0
1 0 0 1
0 1 2 3

数据范围与提示

对于 100%100\% 的数据,$1 \le n,m \le 3 \cdot 10^5,n \cdot m \le 3 \cdot 10^5,0 \le s \le m,1 \le a_p, b_p \le n+p,0 \le x_{i,j} < m$。
具体数据限制如下表:

子任务编号 限制 分值
11 n2,m103n \le 2,m \le 10^3 1010
22 n2,m105n \le 2,m \le 10^5
33 n10,m2n \le 10,m \le 2
44 xi,j=i1x_{i,j} = i-1 55
55 opp=1op_p=1
66 n100n \le 100 2020
77 每一行的 NMLP 相同 1010
88 - 3030