| #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];
 }
 
 |