RT,显示TLE on #test 10
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
template <typename QwQ>
void read(QwQ &mitsuha){
mitsuha = 0;bool taki = true;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')taki = false;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
mitsuha = (mitsuha << 3) + (mitsuha << 1) + (ch ^ 48);
ch = getchar();
}
}
struct Edge{
int to,ne;
}e[N << 1];
int n,m,h[N],idx,st[N],top;
ll k,a[N],d[N],f[N];
bool flag = true,vis[N];
void add(int u,int v){
e[++ idx] = (Edge){v,h[u]};
h[u] = idx;
}
bool check(ll mid){
for(int i = 1 ; i <= n ; i ++ )d[i] = f[i] = 0,vis[i] = false;
for(int i = 1 ; i <= n ; i ++){
if(a[i] > mid)continue;
for(int j = h[i] ; j ; j = e[j].ne){
int v = e[j].to;
if(a[v] > mid)continue;
d[v] ++;
}
}
for(int i = 1 ; i <= n ; i ++){
if(a[i] > mid)continue;
if(d[i] == 0)st[++ top] = i,f[i] = 1,vis[i] = true;
}
while(top){
for(int i = 1 ; i <= top ; i ++){
int u = st[i];
for(int j = h[u] ; j ; j = e[j].ne){
int v = e[j].to;
if(a[v] > mid)continue;
d[v] --;f[v] = max(f[u] + 1,f[v]);
}
}
top = 0;
for(int i = 1 ; i <= n ; i ++){
if(a[i] > mid)continue;
if(d[i] == 0 && (!vis[i])){
st[++ top] = i,vis[i] = true;}
}
}
for(int i = 1 ; i <= n ; i ++)
if(a[i] <= mid && (!vis[i])){
flag = false;return true;
}
ll ans = 0;
for(int i = 1 ; i <= n ; i ++)ans = max(ans,f[i]);
if(ans >= k){
flag = false;return true;
}
return false;
}
int main(){
read(n);read(m);read(k);
ll minn = 1e18,maxn = -0x7fffffff;
for(int i = 1 ; i <= n ; i ++){
read(a[i]);
maxn = max(a[i],maxn);
minn = min(a[i],minn);
}
for(int i = 1 ; i <= m ; i ++){
int u,v;
read(u);read(v);
add(u,v);
}
ll l = minn,r = maxn,ans = -1;
while(l <= r){
ll mid = (l + r) >> 1;
if(check(mid)){
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
printf("%lld",ans);
return 0;
}