最后一个点过了
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int inf=2147483647;
int n,m,G,s,t,ve[1000010],TT,C,D,S,T,tot,L,R,gap[1000010],dis[1000010],cur[1000010];
struct node{int last,en,next,v;} e[1000010];
inline int min(int x,int y){return x<y?x:y;}
void add(int x,int y,int z)
{
e[++tot].en=y;e[tot].v=z;e[tot].next=e[x].last;e[x].last=tot;
e[++tot].en=x;e[tot].v=0;e[tot].next=e[y].last;e[y].last=tot;
}
int dfs(int k,int flow)
{
if (k==T) return flow;
int have=0;
for (int i=cur[k];i;i=e[i].next)
if (dis[e[i].en]+1==dis[k]&&e[i].v)
{
cur[k]=i;
int now=dfs(e[i].en,min(flow-have,e[i].v));
e[i].v-=now;
e[i^1].v+=now;
have+=now;
if (have==flow) return have;
}
cur[k]=e[k].last;
if (!(--gap[dis[k]])) dis[S]=T+1;
++gap[++dis[k]];
return have;
}
int dfs()
{
memset(gap,0,sizeof(gap));
memset(dis,0,sizeof(dis));
memset(cur,0,sizeof(cur));
int ans=0;
gap[0]=T+1;
while (dis[S]<T+1) ans+=dfs(S,inf);
return ans;
}
signed main()
{
while (~scanf("%lld%lld",&n,&m))
{
memset(e,0,sizeof(e));
memset(ve,0,sizeof(ve));
s=0;t=n+m+1;tot=1;
for (int i=1;i<=m;i++)
{
scanf("%lld",&G);
add(s,i,inf-G);
ve[i]+=G;
ve[s]-=G;
}
for (int i=1;i<=n;i++)
{
scanf("%lld%lld",&C,&D);
add(m+i,t,D);
for (int j=1;j<=C;j++)
{
scanf("%lld%lld%lld",&TT,&L,&R);TT++;
add(TT,m+i,R-L);
ve[TT]-=L;
ve[m+i]+=L;
}
}
S=m+n+2;T=m+n+3;
int outflow=0;
for (int i=0;i<=n+m+1;i++)
if (ve[i]>0) add(S,i,ve[i]),outflow+=ve[i];
else if (ve[i]<0) add(i,T,-ve[i]);
add(t,s,inf);
if (dfs()<outflow) printf("-1\n\n");
else
{
int res=e[tot].v;
e[tot].v=e[tot^1].v=0;
S=s;T=t;
printf("%lld\n\n",res+dfs());
}
}
return 0;
}