时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld
题目描述
零和矩阵回环?说真的,V,荒坂给这破网络起的名倒是挺唬人。代码矩阵就藏在核心机房的虚拟镜像里,那些跳来跳去的二进制流?别信它们的规律,那是荒坂的AI故意下的套。看见数据流里偶尔闪一下的红色脉冲没?那是上一个破解者的最后信号——他试图硬闯,结果被矩阵拆成了128段,现在还在里面哀嚎。倒计时开始了,V,我给你算好了,从接入到攻破核心,你只有两秒钟的时间。超时?荒坂的反制程序会把你的意识拆成0和1,贴在他们的网络公告栏上,标题就叫“又一个不自量力的赛博疯子”。
夜之城普普通通的五星好市民V正在入侵荒坂网络,然而攻破荒坂的加密系统太难了,于是V向擅长编程的你寻求帮助。
荒坂公司有一套加密系统,其本质是一个

行

列的代码矩阵,初始时矩阵为空,系统会进行

次操作,每次操作会在矩阵中添加一个数字,第

次操作是
)
,表示在矩阵的第

行第

列添加一个数字

。每次操作后,你需要判断当前矩阵是否是可破解的。
破解矩阵需要找到矩阵中所有破解序列,破解序列是按照特定规则在矩阵中选择数字形成的多重集。
一条破解序列的生成规则如下:
首先将矩阵内所有数字标记为可选数字。
第 1 步:任选一个可选数字,坐标为
)
,将该数字标记为不可选。
第 2 步:从第

行中任选一个可选数字,坐标为
)
,然后将第

行的所有数字标记为不可选。
第 3 步:从第

列中任选一个可选数字,坐标为
)
,然后将第

列的所有数字标记为不可选。
第 4 步:从第

行中任选一个可选数字,坐标为
)
,然后将第

行的所有数字标记为不可选。
...
第 2k 步:从第

行中任选一个可选数字,坐标为
)
,然后将第

行的所有数字标记为不可选。
第 2k+1 步:从第

列中任选一个可选数字,坐标为
)
,然后将第

列的所有数字标记为不可选。
终止条件:
-
情况1:某一步(除了第一步)选到的数字与第一步所选数字在同一列。此时停止选择,被选中的数字形成一条破解序列。
-
情况2:始终不满足情况1,并且无法继续选择。此时也停止选择,但是没有形成破解序列。
一条破解序列是可破解的当且仅当该序列内所有数字的异或和为

。
一个矩阵是可破解的当且仅当该矩阵中
所有破解序列都是可破解的。特别地,如果一个矩阵中没有破解序列,那么该矩阵也是可破解的。
你的任务是每次操作后,判断当前矩阵是否是可破解的。
输入描述:
第一行包含一个整数
,表示测试数据的组数。
对于每组测试数据:
第一行包含两个整数
,分别表示矩阵的大小和操作的次数。
接下来
行,每行包含三个整数
,表示在矩阵的第
行第
列添加一个数字
。
保证每组测试数据中添加的坐标互不相同。
保证所有测试数据的
的总和不超过
。
输出描述:
对于每组测试数据,输出共
行,若第
次操作后矩阵是可破解的,输出 YES;否则输出 NO。
示例2
输入
复制
2
3 4
2 1 1
1 2 1
2 2 1
1 1 0
5 16
2 3 1
4 1 2
4 3 1
4 2 3
3 4 1
5 5 2
1 4 1
3 5 2
1 1 0
4 4 3
2 1 2
2 5 0
2 4 3
5 3 1
2 2 1
5 1 2
输出
复制
YES
YES
YES
NO
YES
YES
YES
YES
YES
YES
YES
YES
YES
YES
YES
YES
YES
NO
NO
NO