感觉是缩点写错了
// 缩点 + TP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e5 + 20;
ll n, m, k[N], maxx1 = 0, maxx2 = 0;
ll dfn[N], low[N], cnt = 0;
ll tot = 0, val[N], C[N], in[N], Max[N], TR[N], f[N];
stack<ll> S;
queue<ll> q;
bool vis[N];
vector<ll> G[N], New[N];
void add_edge(ll u, ll v) {
G[u].push_back(v);
}
void Tarjan(ll u) {
dfn[u] = low[u] = ++cnt;
S.push(u);
for(int i = 0; i < G[u].size(); i++) {
ll v = G[u][i];
if(!dfn[v]) {
Tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(!C[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]) {
ll maxx = 0;
++tot;
while(!S.empty() && S.top() != u) maxx = max(maxx, k[S.top()]), val[tot] += k[S.top()], C[S.top()] = tot, S.pop();
C[S.top()] = tot;
Max[tot] = max(maxx, k[S.top()]);
TR[tot] = Max[tot];
val[tot] += k[S.top()];
S.pop();
}
}
void PR() {
for(int i = 1; i <= tot; i++) {
for(int j = 0; j < New[i].size(); j++) {
cout << i << " " << New[i][j] << endl;
}
}
}
int main (){
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i++) scanf("%lld", &k[i]);
for(int i = 1; i <= m; i++) {
ll u, v;
scanf("%lld%lld", &u, &v);
add_edge(u, v);
in[v]++;
}
for(int i = 1; i <= n; i++) if(!dfn[i] && in[i] == 0) Tarjan(i);
memset(in, 0, sizeof(in));
for(int i = 1; i <= n; i++) {
ll u = i;
for(int j = 0; j < G[u].size(); j++) {
ll v = G[u][j];
if(C[u] != C[v]) {
// cout << C[u] << " " << C[v] << " " << val[C[u]] << " " << val[C[v]] << endl;
New[C[u]].push_back(C[v]);
in[C[v]] ++;
}
}
}
for(int i = 1; i <= tot; i++) {
if(in[i] == 0) q.push(i);
// if(in[i] == 0) cout << i << endl;
}
// cout << in[3];
//PR();
while(!q.empty()) {
ll u = q.front();
f[u] = max(f[u], val[u]);
// cout << u << endl;
q.pop();
for(int i = 0; i < New[u].size(); i++) {
ll v = New[u][i];
f[v] = max(f[v], val[v]);
if(f[u] + val[v] >= f[v]) Max[v] = f[u] + val[v] > f[v] ? max(Max[u], TR[v]) : max(Max[v], Max[u]) , f[v] = f[u] + val[v];
if(f[v] >= maxx1) maxx2 = f[v] > maxx1 ? Max[v] : max(maxx2, Max[v]), maxx1 = f[v];
--in[v];
if(in[v] == 0) q.push(v);
}
}
printf("%lld %lld", maxx1, maxx2);
return 0;
}
/*
6 6
1000 3 2 2 1 999
3 1
4 2
3 2
4 1
1 5
2 6
1004 999
*/