#1014. 和与积的匹配

和与积的匹配

题目描述

给定一个长度为 nn 的序列 a1,a2,…,ana_1, a_2, \dots, a_n,其中 ai∈{0,1}a_i \in \{0,1\}。

现在有 qq 次询问,每次询问给定三个整数 l,r,kl, r, k。你需要更改序列在区间 [l,r][l, r] 内某些位置上的数值(只能改为 00 或 11),使得满足以下等式:

∑i=lrai=k+∏i=lrai\sum_{i=l}^r a_i = k + \prod_{i=l}^r a_i

也就是说,要让 al∼ara_l \sim a_r 这段区间的元素之和,恰好等于它们的乘积再加上 kk。

请针对每次询问,求出最少的修改次数。如果无论如何修改都无法满足条件,请输出 -1。

请注意:每次询问中的更改只是假设,不会对后续的询问产生实际影响。

公式中的 ∑i=lrai\sum_{i=l}^r a_i 是求和符号,表示对序列中从下标 ll 到 rr 的所有元素进行相加,即 al+al+1+⋯+ara_l + a_{l+1} + \dots + a_r。

公式中的 ∏i=lrai\prod_{i=l}^r a_i 是求积(连乘)符号,表示对序列中从下标 ll 到 rr 的所有元素进行相乘,即 al×al+1×⋯×ara_l \times a_{l+1} \times \dots \times a_r。

输入格式

第一行包含两个正整数 n,qn, q —— 分别表示序列的长度和询问的次数。

第二行包含 nn 个整数 a1,a2,…,ana_1, a_2, \dots, a_n —— 表示序列 aa 的元素。

接下来 qq 行,每行包含三个整数 l,r,kl, r, k,表示一次询问。

输出格式

输出共 qq 行,每行一个整数,表示对应询问的最少修改次数。如果无解请输出 -1。

样例输入 1

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

样例输出 1

1
1
0 
-1

样例输入 2

8 3
1 1 1 1 1 1 1 1
2 6 2
5 8 2
1 8 7

样例输出 2

3
2
0

说明

样例解释

对于样例 11,序列为 a={0,0,1,0,1}a=\{0,0,1,0,1\}:

  • 第一个询问 [1,3][1, 3],目标 k=2k=2。只需将 a1a_1 或 a2a_2 改为 11。修改后区间元素为 {1,0,1}\{1,0,1\} 或 {0,1,1}\{0,1,1\},此时和为 22,乘积为 00,2=0+22 = 0 + 2 成立。最少修改 11 次。
  • 第二个询问 [2,4][2, 4],目标 k=0k=0。只需将 a3a_3 改为 00。修改后区间元素为 {0,0,0}\{0,0,0\},此时和为 00,乘积为 00,0=0+00 = 0 + 0 成立。最少修改 11 次。
  • 第三个询问 [3,5][3, 5],目标 k=2k=2。不需进行更改,原区间元素为 {1,0,1}\{1,0,1\},和为 22,乘积为 00,2=0+22 = 0 + 2 成立。最少修改 00 次。
  • 第四个询问 [1,1][1, 1],目标 k=1k=1。因为只有一个数,所以它的和与积永远相等(无论是 00 还是 11),不可能满足“和 = 积 +1+ 1”,所以无解,输出 -1。

数据范围

对于所有测试点,保证:

  • 1≤n,q≤1061 \le n, q \le 10^6。
  • 0≤k≤1060 \le k \le 10^6。
  • 1≤l≤r≤n1 \le l \le r \le n。
  • 保证 ai∈{0,1}a_i \in \{0, 1\}。
  • 保证所有的输入数值均为整数。