#include<bits/stdc++.h> #define lb(x) x&(-x) using namespace std; typedef long long ll; const int N = 1e6+1;
int n,m,fa[N],st[N],ed[N],top[N],d[N],sz[N],son[N],totw; int a[N],f[N],g[N],X[N],Y[N],W[N];
struct nd { int ne[N*2],to[N*2]; int head[N],cnt; void in(int x,int y){to[++cnt]=y;ne[cnt]=head[x];head[x]=cnt;} void init(){memset(head,0,sizeof(head));cnt=0;} }e,e1;
void dfs1(int x) { sz[x]=1; for(int i=e.head[x];i;i=e.ne[i]) { int y=e.to[i]; d[y]=d[x]+1; dfs1(y);
sz[x]+=sz[y]; if(sz[son[x]]<sz[y])son[x]=y; } }
void dfs2(int x) { st[x]=++totw; int y=son[x];if(!y)return; top[y]=top[x];dfs2(y); for(int i=e.head[x];i;i=e.ne[i]) { y=e.to[i]; if(y==son[x])continue; top[y]=y; dfs2(y); } ed[x]=totw; }
void insert(int x,int d) { for(int i=x;i<=n;i+=lb(i))a[i]+=d; }
int sum(int x,int y) { if(!x||!y)return 0; int ret=0; for(int i=y;i;i-=lb(i))ret+=a[i]; for(int i=x-1;i;i-=lb(i))ret-=a[i]; return ret; }
int lca(int x,int y) { while(top[x]!=top[y]) { if(d[top[x]]<d[top[y]])swap(x,y); x=fa[top[x]]; } if(d[x]<d[y])return x; return y; }
int query(int x,int y) { int ret=0; while(top[x]!=top[y]) { if(d[top[x]]<d[top[y]])swap(x,y); ret+=sum(st[top[x]],st[x]); x=fa[top[x]]; } if(st[x]>st[y])swap(x,y); ret+=sum(st[x],st[y]); return ret; }
int dp(int x) { for(int i=e.head[x];i;i=e.ne[i]) dp(e.to[i]),g[x]+=f[e.to[i]]; f[x]=g[x]; for(int i=e1.head[x];i;i=e1.ne[i]) { int to=e1.to[i]; f[x]=max(f[x],query(X[to],Y[to])+W[to]); } insert(st[x],-f[x]); if(fa[x])insert(st[fa[x]],f[x]); }
int main() {
scanf("%d%d",&n,&m); for(int i=2;i<=n;++i)scanf("%d",&fa[i]),e.in(fa[i],i); top[1]=1;dfs1(1);dfs2(1); for(int i=1;i<=m;++i) { scanf("%d%d%d",&X[i],&Y[i],&W[i]); e1.in(lca(X[i],Y[i]),i); } dp(1); cout<<f[1]; }
|