func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXM = 2e5 + 3, MAXN = 2e5 + 3, MAXQ = 2e5 + 3, MAXC = 2e5 + 3,             ADD = 1 << 18;   int n, m, q;   int edge_from[MAXM << 1], edge_to[MAXM << 1], edge_nex[MAXM << 1];   int cntm = 1, head[MAXN];   void link(int from, int to) {     edge_from[++cntm] = from;     edge_to[cntm] = to;     edge_nex[cntm] = head[from];     head[from] = cntm;   }   bool isb[MAXM << 1];   int edge1_to[MAXC << 1], edge1_nex[MAXC << 1];   int cntm1 = 0, head1[MAXC];   void link1(int from, int to) {     edge1_to[++cntm1] = to;     edge1_nex[cntm1] = head1[from];     head1[from] = cntm1;   }   int dfn[MAXN], low[MAXN], cntd = 0;   void tarjan(int now, int fa) {     low[now] = dfn[now] = ++cntd;     for (int i = head[now]; i; i = edge_nex[i]) {       if ((i ^ 1) == fa) continue;       if (!dfn[edge_to[i]]) {         tarjan(edge_to[i], i);         if (low[edge_to[i]] > low[now]) {           isb[i] = isb[i ^ 1] = 1;         } else {           low[now] = low[edge_to[i]];         }       } else {         low[now] = min(low[now], low[edge_to[i]]);       }     }   }   int col[MAXN], cntc = 0, Fa[MAXC][23], Deep[MAXC], cntd1 = 0;   void dfs(int now) {     col[now] = cntc;     for (int i = head[now]; i; i = edge_nex[i])       if (!col[edge_to[i]] && !isb[i]) dfs(edge_to[i]);   }   void dfs2(int now) {     for (int i = head1[now]; i; i = edge1_nex[i]) {       if (!Deep[edge1_to[i]] && edge1_to[i] != Fa[now][0]) {         Fa[edge1_to[i]][0] = now;         Deep[edge1_to[i]] = Deep[now] + 1;         dfs2(edge1_to[i]);       }     }   }   long long val1[MAXN];   long long sum1;   bool Arr[MAXN];   int ans = 1;   void dfs3(int now) {     if (!ans) return;     Arr[now] = 1;     long long in1 = sum1;     sum1 += val1[now];     for (int i = head1[now]; i; i = edge1_nex[i])       if (!Arr[edge1_to[i]] && ans) dfs3(edge1_to[i]);     in1 = sum1 - in1;     if ((in1 >> 18) && in1 - ((in1 >> 18) << 18)) ans = 0;   }   inline int lca(register int A, register int B) {     if (Deep[A] < Deep[B]) swap(A, B);     for (int i = 17; i >= 0; i--) {       if (Deep[Fa[A][i]] >= Deep[B]) A = Fa[A][i];     }     if (A == B) return A;     for (int i = 17; i >= 0; i--) {       if (Fa[A][i] != Fa[B][i]) {         A = Fa[A][i];         B = Fa[B][i];       }     }     if (Fa[A][0] == Fa[B][0] && Fa[A][0] != 0) return Fa[A][0];     return -1;   }   int main() {     ios::sync_with_stdio(false);     cin >> n >> m >> q;     for (int i = 1, U, V; i <= m; i++) {       cin >> U >> V;       link(U, V);       link(V, U);     }     for (int i = 1; i <= n; i++)       if (!dfn[i]) tarjan(i, 0);     for (int i = 1; i <= n; i++)       if (!col[i]) {         cntc++;         dfs(i);       }     for (int i = 2; i <= cntm; i++)       if (isb[i]) link1(col[edge_from[i]], col[edge_to[i]]);     for (int i = 1; i <= cntc; i++)       if (!Deep[i]) {         Deep[i] = 1;         dfs2(i);       }     for (int i = 1; i <= 17; i++)       for (int j = 1; j <= cntc; j++) Fa[j][i] = Fa[Fa[j][i - 1]][i - 1];     for (int i = 1, i2, i3, i4; i <= q; i++) {       cin >> i2 >> i3;       i2 = col[i2];       i3 = col[i3];       if (i2 == i3) continue;       i4 = lca(i2, i3);       if (i4 == -1) {         ans = 0;         break;       }       val1[i2] += 1;       val1[i4] -= 1;       val1[i3] += ADD;       val1[i4] -= ADD;     }     for (int i = 1; i <= cntc; i++)       if (!Arr[i]) dfs3(i);     if (ans)       cout <<  Yes ;     else       cout <<  No ;   }   