题目描述
小 T 即将从 TeaLand 小学毕业!现在他正在进行期末考试,并且被最后一道题卡住了。
这道题是这样说的:给出 n 个线性函数 f1,f2,f3,…,fn,求出 fr(fr−1(fr−2(…fl(x)))) 的值。
很显然,只需要从后往前求出每一个值后再继续计算就可以了,但是 TeaLand 位于充满魔法与奇迹的世界上,所以试卷上的 l,r,x 都会随着时间变化,不过好在 fi 不会变化!
你能帮帮小 T 吗?
说人话:给出 n 个线性函数 fi(x)=kix+bi,有 m 次询问,求出从 l 到 r 依次计算 fi(x) 的结果,其中 i>l 时 x 是 fi−1 的结果 ,否则为给定的参数 x。
输入格式
第一行两个正整数 n,m。
之后 n 行,每行两个整数 ki,bi,表示初始时的一个线性函数 fi。
之后 m 行,每行三个整数 l,r,x,表示一个询问。
输出格式
假设第 i 次询问的答案是 Ai,由于答案非常大,所有首先将 Ai 对 109+7 取模,由于询问量也非常大,所以你只需要输出所有 Ai 的异或即可。
即:如果 m=3 而你的答案分别是 {109+8,2,3},那么你应该输出一行一个整数 0,因为 109+8mod109+7=1,1 xor 2 xor 3=0。
样例
输入样例
3 4
1 2
3 4
5 6
1 1 1
2 2 1
3 3 1
1 3 2
输出样例
89
提示
对于 30% 的数据,保证 n,m≤103。
对于另外 10% 的数据,保证 l=1。
对于另外 30% 的数据,保证 n,m≤105。
对于所有的数据,保证 1≤n,m≤2×106,1≤kibi,x≤109,1≤l≤r≤n,1≤i≤n。
由于输入数据量非常大,你可能需要如下的快速读入:
// Here we don't need long long because the input data never greater than 1e9
int read() {
int x = 0; char ch = 0;
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
return x;
}