灯珠亮度只有 1 和 2,任意连续片段的乘积都是 2 的幂。因此“各段乘积相同”等价于“各段中亮度为 2 的灯珠个数相同”。
设当前亮度为 2 的灯珠总数为 c2,要分成 z 段且每段恰好 k 个 2,必须 c2=z⋅k,即 c2 能被 z 整除。
分情况判断:
No。一条灯带上依次排列着 n 颗灯珠,第 i 颗灯珠的亮度等级为 ai,且每个亮度只能是 1 或 2。接下来会依次进行 m 次维护。
每次维护给出三个整数 x、y、z:先把第 x 颗灯珠的亮度改为 y(y 仍只能是 1 或 2);然后询问:能否把当前整条灯带划分成恰好 z 个连续且非空的片段,使得这 z 个片段内亮度的乘积全部相等。
划分成 z 段是指选择 z−1 个切分位置,将灯带分成 z 个连续、非空、互不相交且恰好覆盖整条灯带的片段。每次修改会保留到后续维护中。
约束:测试组数不超过 10^4,单组灯珠个数与维护次数均不超过 2×10^5,且单个测试文件中灯珠个数之和、维护次数之和均不超过 2×10^5。
每个测试文件包含多组数据。第一行一个整数 T,表示数据组数。
每组数据格式如下:
第一行两个整数 n 和 m,分别表示灯珠个数与维护次数;
第二行 n 个整数 a1,a2,…,an,每个为 1 或 2;
接下来 m 行,每行三个整数 x、y、z,表示一次维护。
保证 1≤T≤104,1≤n,m≤2×105,1≤x≤n,y∈{1,2},1≤z≤n,且单个文件中 n 之和与 m 之和均不超过 2×105。
对每组数据输出 m 行。每次维护后,若可以完成所需划分,输出 Yes;否则输出 No。
输入
2
4 4
1 2 1 2
1 1 1
2 1 2
3 2 2
4 2 3
3 3
1 1 1
2 1 2
1 2 2
3 2 1
输出
Yes
No
Yes
No
Yes
No
Yes
说明
第一组初始亮度为 1,2,1,2。
第一次维护把第 1 颗改为 1,灯带不变。分成 1 段即整条灯带,乘积条件显然成立,输出 Yes。
第二次把第 2 颗改为 1,得到 1,1,1,2。亮度为 2 的个数为 1,不能均分成 2 段,输出 No。
第三次得到 1,1,2,2,每段各 1 个 2 可分成两段,输出 Yes。
第四次得到 1,1,2,2,2 的总数为 2,不能被 3 整除,输出 No。
第二组初始为 1,1,1。三次维护后分别得到 Yes、No、Yes。
输入
1
3 3
1 1 1
1 1 2
2 2 3
3 1 1
输出
Yes
No
Yes
说明
初始三颗灯珠全是 1,亮度为 2 的个数为 0。
第一次询问 z=2,全 1 时只要 z≤n 即可,输出 Yes。
第二次把第 2 颗改为 2,得到 1,2,1,仅 1 个 2,不能被 z=3 整除,输出 No。
第三次 z=1,整条灯带作为一段,输出 Yes。
输入
1
1 2
2
1 2 1
1 1 1
输出
Yes
Yes
说明
只有一颗灯珠,亮度为 2。
两次维护都要求分成 1 段,整条灯带本身就是一段,因此都输出 Yes。这是 n=1 的边界情形。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.