On Changing Tree

Time Limit: 2000ms
Memory Limit: 262144KB

This problem will be judged on CodeForces. Original ID: 396C
64-bit integer IO format: %I64d      Java class name: (Any)

 
You are given a rooted tree consisting of n vertices numbered from 1 to n. The root of the tree is a vertex number 1.

Initially all vertices contain number 0. Then come q queries, each query has one of the two types:

  • The format of the query: 1 v x k. In response to the query, you need to add to the number at vertex v number x; to the numbers at the descendants of vertex v at distance 1, addx - k; and so on, to the numbers written in the descendants of vertex v at distance i, you need to add x - (i·k). The distance between two vertices is the number of edges in the shortest path between these vertices.
  • The format of the query: 2 v. In reply to the query you should print the number written in vertex v modulo 1000000007 (109 + 7).

Process the queries given in the input.

Input

The first line contains integer n (1 ≤ n ≤ 3·105) — the number of vertices in the tree. The second line contains n - 1 integers p2, p3, ... pn (1 ≤ pi < i), where pi is the number of the vertex that is the parent of vertex i in the tree.

The third line contains integer q (1 ≤ q ≤ 3·105) — the number of queries. Next q lines contain the queries, one per line. The first number in the line is type. It represents the type of the query. If type = 1, then next follow space-separated integers v, x, k (1 ≤ v ≤ n; 0 ≤ x < 109 + 7; 0 ≤ k < 109 + 7). If type = 2, then next follows integer v (1 ≤ v ≤ n) — the vertex where you need to find the value of the number.

 

Output

For each query of the second type print on a single line the number written in the vertex from the query. Print the number modulo 1000000007 (109 + 7).

 

Sample Input

Input
3
1 1
3
1 1 2 1
2 1
2 2
Output
2
1

Hint

You can read about a rooted tree here: http://en.wikipedia.org/wiki/Tree_(graph_theory).

 

Source

 
解题:树状数组或者线段树
 
给出一棵以1为根的树,形式是从节点2开始给出每个节点的父亲节点;
然后是m次操作,操作分为两种,1 v, x, k,表示在以v为根的字数上添加,添加的法则是看这个节点与v节点的距离为i的话,加上x-i*k;
2 v查询节点v的值。
 
发现相加的性质,维护两个树状数组
 
给c1 结点代表的区间都加上x + d[u]*k 给第二个树状数组也加上 d[u]*k
 
假设u是v的父节点 当计算v的时候 可以用$ x + d[u]*k - d[v]*k $
 
正是我们要的$x + k\times (d[u] - d[v])$
 
 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = ;
const int mod = ;
vector<int>g[maxn];
LL c[][maxn],val[];
int n,m,L[maxn],R[maxn],d[maxn],clk;
void update(int i){
while(i < maxn){
c[][i] += val[];
c[][i] += val[];
c[][i] %= mod;
c[][i] %= mod;
i += i&-i;
}
}
LL query(int i){
LL sum[] = {},dep = d[i];
i = L[i];
while(i > ){
sum[] += c[][i];
sum[] += c[][i];
sum[] %= mod;
sum[] %= mod;
i -= i&-i;
}
return ((sum[] - dep*sum[])%mod + mod)%mod;
}
void dfs(int u,int dep){
L[u] = ++clk;
d[u] = dep;
for(int i = g[u].size()-; i >= ; --i)
dfs(g[u][i],dep+);
R[u] = clk;
}
int main(){
int u,op,x,y,z;
while(~scanf("%d",&n)){
for(int i = clk = ; i <= n; ++i) g[i].clear();
for(int i = ; i <= n; ++i){
scanf("%d",&u);
g[u].push_back(i);
}
dfs(,);
memset(c,,sizeof c);
scanf("%d",&m);
while(m--){
scanf("%d%d",&op,&x);
if(op == ){
scanf("%d%d",&y,&z);
val[] = ((LL)y + (LL)d[x]*z)%mod;
val[] = z;
update(L[x]);
val[] = -val[];
val[] = -val[];
update(R[x]+);
}else printf("%I64d\n",query(x));
}
}
return ;
}

最新文章

  1. 比较.NET程序集(DLL或EXE)是否相同
  2. sqlserver 自增ID插入指定数据
  3. Install Docker on Mac OS X(转)
  4. http://blog.csdn.net/hitmediaman/article/details/6636402
  5. &ldquo;System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&rdquo; 的解决方案
  6. 玩转html5&lt;canvas&gt;画图
  7. HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))
  8. (转载)PHP json_encode() 函数介绍
  9. 今天进行了一次IOS面试,分享一下面试结果
  10. 网站引导页flash动画跳转js脚本
  11. [机器学习] Apriori算法
  12. VM安装Ubuntu问题合集(无法联网、中文界面设置、中文输入法etc)
  13. elasticsearch6.6及其插件安装记录(较详细)
  14. NOIP2013花匠(波动序列)
  15. Docker Kubernetes 创建管理 Pod
  16. MySQL(十二)游标和触发器
  17. 常见的原生javascript DOM操作
  18. HTML(三)选择器--复杂选择器
  19. Ubuntu下SSH安装
  20. 【大数据系列】hadoop单机模式安装

热门文章

  1. nginx+tomcat反复请求
  2. luogu2763 试题库问题 二分匹配
  3. Linux下查看操作系统的位数和系统名称版本信息
  4. C语言程序判断文件夹是否存在
  5. hihoCoder 1033
  6. # 深入理解Redis(二)——内存管理的建议与技巧
  7. Struts2 在登录拦截器中对ajax请求的处理
  8. JDBC: 批量处理提高SQL处理速度
  9. AI:IPPR的数学表示-CNN可视化语义分析
  10. 读书笔记「Python编程:从入门到实践」_7.用户输入和while循环