On Changing Tree

On Changing Tree,第1张

概述C. On Changing Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a rooted tree consisting of n vertices numbered from 1 t C. On Changing Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output

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: 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,add x - 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: 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 ≤ n0 ≤ 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).

Examples input copy
3
1 1
3
1 1 2 1
2 1
2 2
output copy
2
1
Note

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

#pragma GCC optimize(2)#include <bits/stdc++.h>#define lowbit(x) x&(-x)using namespace std;const int maxn = 1e6 + 108;typedef long long ll;const ll mod=1e9+7;int n,q;int fa[maxn],dfn[maxn],siz[maxn],dep[maxn];vector<int>e[maxn];inline int dfs(int cur){    static int tot=0;    dfn[cur]=++tot;    for(register int i=0;i<e[cur].size();++i){        int to=e[cur][i];        siz[cur]+=dfs(to);    }    //printf("deBUG dfn[%d] = %d\n",cur,dfn[cur]);    return ++siz[cur];}struct BIT{    ll o[maxn];    inline voID init(){        memset(o,0,sizeof(o));    }    inline voID update(int pos,ll val){        while(pos<=n){            o[pos]=(o[pos]+val)%mod;            pos+=lowbit(pos);        }    }    inline ll query(int pos){        ll res=0;        while(pos){            res=(res+o[pos])%mod;            pos-=lowbit(pos);        }        return res%mod;    }}atom1,atom2;int main() {#ifndef ONliNE_JUDGE    freopen("1.txt","r",stdin);#endif    scanf("%d",&n);    for(register int i=2;i<=n;++i){        scanf("%d",&fa[i]);        e[fa[i]].emplace_back(i);        dep[i]=dep[fa[i]]+1;    }    atom1.init();    atom2.init();    dfs(1);    scanf("%d",&q);    int type,v,x;    ll k;    while(q--){        scanf("%d",&type);        if(type==1){            scanf("%d%d%lld",&v,&x,&k);            atom1.update(dfn[v],x+dep[v]*k%mod);            atom1.update(dfn[v]+siz[v],mod-(x+dep[v]*k%mod)%mod);            atom2.update(dfn[v],k);            atom2.update(dfn[v]+siz[v],(mod-k%mod)%mod);        }        else{            scanf("%d",&v);            printf("%lld\n",(atom1.query(dfn[v])%mod-dep[v]*atom2.query(dfn[v])%mod+mod)%mod);        }    }    return 0;}
总结

以上是内存溢出为你收集整理的On Changing Tree全部内容,希望文章能够帮你解决On Changing Tree所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1024338.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存