func_code_string: #include <bits/stdc++.h>   using namespace std;   void propagate(int node, const map<int, set<int> >& idToChildren,                  set<int>& leaves) {     map<int, set<int> >::const_iterator it = idToChildren.find(node);     if (it == idToChildren.end()) {       leaves.insert(node);       return;     }     const set<int>& s = (*it).second;     for (set<int>::const_iterator cit = s.begin(); cit != s.end(); ++cit) {       propagate(*cit, idToChildren, leaves);     }   }   int main() {     int n;     cin >> n;     int f[n + 1];     char visited[n + 1];     char inLoop[n + 1];     int tag[n + 1];     char hasParent[n + 1];     char hasChild[n + 1];     for (int i = 1; i <= n; i++) {       cin >> f[i];       visited[i] = inLoop[i] = 0;       tag[i] = i;       hasParent[i] = hasChild[i] = 0;     }     for (int i = 1; i <= n; i++) {       if (visited[i]) continue;       bool found = false;       set<int> traversed;       visited[i] = 1;       traversed.insert(i);       int x = i;       int confluence = -1;       while (1) {         int xTemp = f[x];         if (inLoop[xTemp]) {           f[x] = tag[xTemp];           break;         } else if (traversed.find(xTemp) != traversed.end()) {           found = true;           confluence = xTemp;           break;         } else if (visited[xTemp]) {           break;         } else {           x = xTemp;           visited[x] = 1;           traversed.insert(x);         }       }       if (found) {         int y = confluence;         do {           tag[y] = confluence;           inLoop[y] = 1;           y = f[y];         } while (y != confluence);       }     }     map<int, set<int> > idToChildren;     map<int, set<int> > rootToLeaves;     for (int i = 1; i <= n; i++) {       if (inLoop[i]) continue;       hasParent[i] = hasChild[f[i]] = 1;       idToChildren[f[i]].insert(i);     }     set<int> roots;     set<int> leaves;     for (int i = 1; i <= n; i++) {       if (tag[i] != i) continue;       if (!hasParent[i]) {         roots.insert(i);       }       if (!hasChild[i]) {         leaves.insert(i);       }     }     for (set<int>::const_iterator it = roots.begin(); it != roots.end(); ++it) {       propagate(*it, idToChildren, rootToLeaves[*it]);     }     if (leaves.size() == 1 && *leaves.begin() == *roots.begin()) {       cout << 0 << endl;       return 0;     }     cout << leaves.size() << endl;     int firstRoot = *roots.begin();     int prevRoot = firstRoot;     {       set<int>::const_iterator it = roots.begin();       advance(it, 1);       for (; it != roots.end(); ++it) {         for (set<int>::const_iterator lit = rootToLeaves[*it].begin();              lit != rootToLeaves[*it].end(); ++lit) {           cout << prevRoot <<     << *lit << endl;         }         prevRoot = *it;       }     }     for (set<int>::const_iterator it = rootToLeaves[firstRoot].begin();          it != rootToLeaves[firstRoot].end(); ++it) {       cout << prevRoot <<     << *it << endl;     }     return 0;   }   