个人猜测是tuopu挂了
#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define MP make_pair
using namespace std;
const int N = 1e5 + 10;
struct mystack
{
int val[N], tp = 0;
bitset <N> ins;
inline void push(int x)
{
ins[x] = true;
val[tp++] = x;
}
inline void pop()
{
ins[val[--tp]] = false;
}
inline int top ()
{
return val[tp - 1];
}
}s;
int ver[2 * N], Next[2 * N], head[N], tot;
int ver2[2 * N], Next2[2 * N], head2[N], tot2;
int dfn[N], low[N], c[N], f[N], in[N], ss[N], p[N], dis[N];
int n, m, num, cnt, ans;
queue <int> q;
void add (int x, int y)
{
ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}
void add2 (int x, int y)
{
ver2[++tot2] = y, Next2[tot2] = head2[x], head2[x] = tot2;
}
void tarjan (int x)
{
dfn[x] = low[x] = ++num;
s.push (x);
for (int i = head[x]; i; i = Next[i])
{
int y = ver[i];
if (!dfn[y])
{
tarjan (ver[i]);
low[x] = min (low[x], low[y]);
}
else if (s.ins[y])
{
low[x] = min (low[x], dfn[y]);
}
}
if (dfn[x] == low[x])
{
cnt++;
int y;
do
{
y = s.top ();
s.pop ();
c[y] = cnt;
p[cnt] += ss[y];
}
while (x != y);
}
}
void tuopu ()
{
for (int i = 1; i <= cnt; i++)
{
f[i] = p[i];
if (!in[i])
{
q.push (i);
}
}
while (!q.empty ())
{
int u = q.front ();
q.pop ();
for (int i = head2[u]; i; i = Next2[i])
{
int v = ver2[i];
f[v] = max (f[v], f[u] + p[v]);
in[v]--;
if (!in[v])q.push (v);
}
}
for (int i = 1; i <= cnt; i++)
{
ans = max (f[i], ans);
}
}
int main ()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> ss[i];
}
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
if (x == y)
{
continue;
}
add (x, y);
}
for (int i = 1; i <= n; i++)
{
if (!dfn[i])
{
num = 0;
tarjan (i);
}
}
for (int i = 1; i <= n; i++)
{
for (int j = head[i]; j; j = Next[j])
{
int y = ver[j];
if (c[i] == c[y]) continue;
add2 (i, y);
in[y]++;
}
}
tuopu ();
cout << ans;
return 0;
}