#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] 内某些位置上的数值(只能改为 0011),使得满足以下等式:

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

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

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

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

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

公式中的 i=lrai\prod_{i=l}^r a_i 是求积(连乘)符号,表示对序列中从下标 llrr 的所有元素进行相乘,即 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_1a2a_2 改为 11。修改后区间元素为 {1,0,1}\{1,0,1\}{0,1,1}\{0,1,1\},此时和为 22,乘积为 002=0+22 = 0 + 2 成立。最少修改 11 次。
  • 第二个询问 [2,4][2, 4],目标 k=0k=0。只需将 a3a_3 改为 00。修改后区间元素为 {0,0,0}\{0,0,0\},此时和为 00,乘积为 000=0+00 = 0 + 0 成立。最少修改 11 次。
  • 第三个询问 [3,5][3, 5],目标 k=2k=2。不需进行更改,原区间元素为 {1,0,1}\{1,0,1\},和为 22,乘积为 002=0+22 = 0 + 2 成立。最少修改 00 次。
  • 第四个询问 [1,1][1, 1],目标 k=1k=1。因为只有一个数,所以它的和与积永远相等(无论是 00 还是 11),不可能满足“和 = 积 +1+ 1”,所以无解,输出 -1

数据范围

对于所有测试点,保证:

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