func_code_string: #include <bits/stdc++.h>   struct itv {     int s1;     int e1;     int s2;     int e2;     int gr;     void up() {       gr = (e2 - s2) + 1;       if (e1) {         gr += (e1 - s1) + 1;       };     };   };   std::vector<std::pair<int, int> > aus;   void merge(int s1, int s2, int sz) {     for (int i = 0; i < sz; i++) {       aus.push_back({s1 + i, s2 + i});     };   };   itv tt[1000];   int main(void) {     int n;     scanf( %d , &n);     int akt = 1;     for (int i = 1; i <= 20; i++) {       int sz = (1 << i);       if (sz > n) break;       for (int j = 1; j <= n; j += sz) {         int s1 = j;         int s2 = j + (sz / 2);         if (s1 + sz > n + 1) break;         merge(s1, s2, sz / 2);       };     };     akt = n;     std::vector<int> pw;     for (int i = 0; i <= 20; i++) {       if (n & (1 << i)) {         pw.push_back(i);         tt[i].s2 = (akt - (1 << i)) + 1;         tt[i].e2 = akt;         tt[i].s1 = 0;         tt[i].e1 = 0;         tt[i].up();         akt -= (1 << i);       };     };     if (pw.size() > 2) {       int ak = 1;       for (int i = 0; i < pw.size() - 2; i++) {         int ap = pw[i];         int np = pw[i + 1];         int ss = tt[ap].e2 - tt[ap].s2 + 1;         if (!i) {           merge(tt[ap].s2, ak, ss);           tt[ap].s1 = ak;           ak += (ss);           tt[ap].e1 = ak - 1;         };         tt[ap].up();         while (tt[ap].gr < tt[np].gr) {           merge(tt[ap].s1, ak, tt[ap].e1 - tt[ap].s1 + 1);           ak += (tt[ap].e1 - tt[ap].s1 + 1);           merge(tt[ap].s2, ak, ss);           ak += (ss);           tt[ap].e1 = ak - 1;           tt[ap].up();         };         merge(tt[ap].s2, tt[np].s2, ss);         merge(tt[ap].s1, tt[np].s2 + ss, tt[ap].e1 - tt[ap].s1 + 1);         tt[np].e2 = tt[ap].e2;         tt[np].s1 = tt[ap].s1;         tt[np].e1 = tt[ap].e1;         tt[np].up();       };     };     printf( %d n , aus.size());     for (auto i : aus) {       printf( %d %d n , i.first, i.second);     };     return 0;   };   