func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e6 + 5, M = (1 << 20) + 5;   template <typename T>   void read(T &x) {     bool neg = false;     unsigned char c = getchar();     for (; (c ^ 48) > 9; c = getchar())       if (c ==  - ) neg = true;     for (x = 0; (c ^ 48) < 10; c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);     if (neg) x = -x;   }   struct line {     int next, to;   } e[N];   int n, m, hd[N], cnt, k, s[25], t[25], f[N], a[M], pop[M];   bool iss[N], ist[N];   void adline(int u, int v) {     e[cnt].to = v;     e[cnt].next = hd[u];     hd[u] = cnt++;   }   void dfs(int u) {     if (f[u]) return;     for (int i = hd[u]; ~i; i = e[i].next) {       int v = e[i].to;       dfs(v);       f[u] |= f[v];     }   }   int main() {     read(n);     read(m);     for (int i = 0, i_end = n; i < i_end; ++i) hd[i] = -1, iss[i] = ist[i] = true;     for (int i = 0, i_end = m; i < i_end; ++i) {       int u, v;       read(u);       read(v);       adline(--u, --v);       ist[u] = false;       iss[v] = false;     }     for (int i = 0, i_end = n; i < i_end; ++i)       if (iss[i]) s[k++] = i;     k = 0;     for (int i = 0, i_end = n; i < i_end; ++i)       if (ist[i]) t[k++] = i;     for (int i = 0, i_end = k; i < i_end; ++i) f[t[i]] = 1 << i;     for (int i = 0, i_end = k; i < i_end; ++i) dfs(s[i]), a[1 << i] = f[s[i]];     for (int i = 1, i_end = 1 << k; i < i_end; ++i)       pop[i] = pop[i ^ (i & -i)] + 1;     for (int i = 1, i_end = (1 << k) - 1; i < i_end; ++i) {       a[i] = a[i & -i] | a[i ^ (i & -i)];       if (pop[a[i]] <= pop[i]) return puts( NO ), 0;     }     puts( YES );     return 0;   }   