On Changing Tree
#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; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥