谢谢你非常抱歉
#include<bits/stdc++.h>
using namespace std;
//#define int long long
int n,m;
int he[501000],tot=0,he2[501000],tot2;
struct node{
int u,v,ne;
}a[5001000],a2[5001000];
void add(int u,int v){
a[++tot].u=u;
a[tot].v=v;
a[tot].ne=he[u];
he[u]=tot;
}
void add_s(int u,int v){
a2[++tot].v=v;
a2[tot].ne=he2[u];
he2[u]=tot2;
}
int dfn[501000],low[501000],id=0,sum=0;
int c[501000],inst[501000];
int w[501000],w2[501000];
int in[501000];
vector<int> ans[501000];
stack<int> st;
void tarjan(int u){
dfn[u]=low[u]=++id;
st.push(u);
inst[u]=1;
for(int i=he[u];i;i=a[i].ne){
int v=a[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(inst[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int top=0;
sum++;
w2[sum]=0;
while(top!=u){
top=st.top();
st.pop();
inst[top]=0;
c[top]=sum;
w2[sum]+=w[top];
// for(int i=he[top];i;i=a[i].ne){
// int v=a[i].v;
// if(qiang[top]!=qiang[v])
// add_s(qiang[top],qiang[v]),in[qiang[v]]++;
// }
}
}
}
int mx=-0x3f3f3f3f,dp[501000];
queue<int> q;
void tp(){
for(int i=1;i<=sum;i++){
if(in[i]==0) q.push(i),dp[i]=w2[i];
//mx=max(dp[i],mx);
}
while(!q.empty()){
int u=q.front();
q.pop();
dp[u]=max(dp[u],w2[u]);
for(int i=he2[u];i;i=a2[i].ne){
int v=a2[i].v;
dp[v]=max(dp[v],dp[u]+w2[v]);
//mx=max(dp[v],mx);
in[v]--;
if(in[v]==0) q.push(v);
}
}
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
//if(u==v) continue;
add(u,v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=tot;i++){
int u=a[i].u,v=a[i].v;
if(c[u]!=c[v]) add_s(c[u],c[v]),in[c[v]]++;
}
tp();
for(int i=1;i<=sum;i++) mx=max(mx,dp[i]);
printf("%d\n",mx);
return 0;
}