给一棵 n 个节点的树,用 1 到 n 的整数表示。每个节点上有一个整数权值 ai。再给出两个整数 L,R。现在有 m 个操作,每个操作这样描述: 给定树上两个节点 u,v 和一个整数 d,表示将树上 u 到 v 唯一的简单路径上每个点的权值 ai 都加上 d。之后求树上所有节点个数大于等于 L 小于等于 R 的简单路径的节点权值和之和。注意这里有两次求和:对于一条节点个数大于等于 L 小于等于 R 的简单路径,求出它所有节点的权值之和;然后对所有这样的路径,对它们的权值和再进行求和。因为答案很大,只用输出对Q=1,000,000,007 取余的结果即可。
输入格式
从标准输入读入数据。 包含多组数据。数据的第一行包含一个正整数 T,表示数据组数。保证 T=10。 每组数据的第一行包含 4 个非负整数 n,m,L,R,分别表示节点个数、操作个数和询问相关的两个参数。保证 1≤L≤R≤n。 第二行包含 n 个整数,表示 ai。保证 0≤ai<Q。 第三行包含 n-1 个整数,描述树的形态,其中第 i 个数 fi 表示节点 i+1 与节点 fi 之间有一条边,保证 1≤fi≤i<n。能够证明,这样能够保证给出的是一棵树。 接下来 m 行,每行包含三个整数 u,v,d,描述一个操作即将树上 u 到 v 唯一的简单路径上每个点的权值 ai 都加上 d,之后询问满足条件的两次求和的结果。保证 1≤u,v≤n,0≤d<Q。 保证上述同一行所有的数之间,均用一个空格隔开。