#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template istream& operator >> (istream& is, vector& vec){for(T& val: vec) is >> val; return is;} template istream& operator , (istream& is, T& val){ return is >> val;} template ostream& operator << (ostream& os, vector& vec){for(int i=0; i fact; //n! vector fact_inv; // (n!)^-1 void make_fact(){ fact[0] = 1; for(long long i=1; i0LL){ if(y&1LL) ret = (ret * x) % MOD; x = (x*x) % MOD; y >>= 1LL; } return ret; } #include int main(){ int n,m; cin >> n,m; vector w(n); cin >> w; vector> G(n); for(int i=0; i> x,y; x--; y--; //if(w[x] >= w[y]) { G[x].push_back(y); } } const int len = 1010; combination_mod cmb(MOD, len); /* vector> dp(len, vector(len, 0)); for(int i=1; i> Stirling2(len, vector(len, 0)); Stirling2[0][0] = 1; for(int i=1; i sz(n, 0); sz[i] = w[i]; priority_queue, vector>, greater>> pq; pq.push({w[i], i}); while(pq.size()){ auto p = pq.top(); pq.pop(); for(int next : G[p.second] ){ int s = min(p.first, w[next]); if(sz[next] >= s) continue; sz[next] = s; pq.push({s,next}); } } for(int j=0; j