#P16046. [Oni2024国家队选拔赛]Graba

[Oni2024国家队选拔赛]Graba

题目描述

Mutu 正在学习 C++。老师要求他写一个有 NN 个整型参数的函数:

$$f : \{0,1,\ldots,10^6\}^{N} \to \{0,1,\ldots,10^6\}.$$

同时,老师给出了 MM 条约束,这些约束用一个大小为 M×(N+1)M\times (N+1) 的矩阵 AA 表示。矩阵行编号为 1M1\sim M,列编号为 1N+11\sim N+1。第 ii 条约束要求:

f(Ai,1,Ai,2,,Ai,N)=Ai,N+1.f(A_{i,1},A_{i,2},\ldots,A_{i,N})=A_{i,N+1}.

但是 Mutu 会写的程序结构很有限。你需要帮他写出的函数只能是下面这种形式:

int f(int x1, ..., int xN) {
    if (x_i1 == j1) return k1;
    if (x_i2 == j2) return k2;
    ...
    if (x_iL == jL) return kL;
    return -1;
}

你可以自行选择判断语句的数量 LL,以及每条语句中的三元组:

(i1,j1,k1),(i2,j2,k2),,(iL,jL,kL).(i_1,j_1,k_1),(i_2,j_2,k_2),\ldots,(i_L,j_L,k_L).

函数会按顺序执行这些 if。也就是说,对于某个输入向量,函数会返回第一条满足条件的语句对应的 ktk_t;如果没有任何语句满足,则返回 -1

任务

给定 N,MN,M 和矩阵 AA,请构造一组 if 语句,使得上述函数满足所有 MM 条约束。

如果不存在这样的函数,输出 -1

输入格式

第一行包含两个整数 N,MN,M

接下来 MM 行,每行包含 N+1N+1 个整数,第 ii 行第 jj 个数表示 Ai,jA_{i,j}

输出格式

如果无解,输出一行:

-1

否则输出 LL 行,每行三个整数:

i_x j_x k_x

xx 行表示一条语句:

if (x_i_x == j_x) return k_x;

输出的语句顺序就是函数中判断语句的执行顺序。

数据范围

  • 1NM10000001\le N\cdot M\le 1\,000\,000
  • 0Ai,j10000000\le A_{i,j}\le 1\,000\,000,其中 1iM1\le i\le M1jN+11\le j\le N+1
  • 对于输出的每条三元组,应满足 1ixN1\le i_x\le N0jx,kx10000000\le j_x,k_x\le 1\,000\,000
  • 1L20000001\le L\le 2\,000\,000

题目保证:如果存在解,则存在一个三元组数量不超过 20000002\,000\,000 的解。

子任务

子任务 分值 限制
1 11 NM50N\cdot M\le 50
2 23 NM200000N\cdot M\le 200\,000
3 18 NM500000N\cdot M\le 500\,000
4 48 无额外限制

注:第 4 个子任务包含两个测试组,分值分别为 29 和 19。

样例 1

输入

4 3
3 2 3 4 4
8 2 2 5 4
3 3 3 6 2

输出

4 9 0
2 2 4
1 3 2

样例 1 解释

输出对应的函数为:

int f(int x1, int x2, int x3, int x4) {
    if (x4 == 9) return 0;
    if (x2 == 2) return 4;
    if (x1 == 3) return 2;
    return -1;
}

它满足:

f(3,2,3,4)=4,f(3,2,3,4)=4, f(8,2,2,5)=4,f(8,2,2,5)=4, f(3,3,3,6)=2.f(3,3,3,6)=2.

样例 2

输入

2 4
0 0 0
0 1 1
1 0 1
1 1 0

输出

-1