1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>

int krawedzie[101][2];

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int liczba_sciezek;
    std::cin >> liczba_sciezek;

    int liczba_wierzcholkow;
    for(liczba_wierzcholkow = 2; 1<<(liczba_wierzcholkow-1) <= liczba_sciezek; ++liczba_wierzcholkow)
        krawedzie[liczba_wierzcholkow<<1][0] = krawedzie[liczba_wierzcholkow<<1|1][0] = (liczba_wierzcholkow-1)<<1,
        krawedzie[liczba_wierzcholkow<<1][1] = krawedzie[liczba_wierzcholkow<<1|1][1] = (liczba_wierzcholkow-1)<<1|1;
    liczba_wierzcholkow = (liczba_wierzcholkow-1)<<1|1;

    for(int roznica = 30, ostatni = 1; liczba_sciezek; --roznica)
        if(1<<roznica <= liczba_sciezek)
        {
            liczba_sciezek -= 1<<roznica;
            ++liczba_wierzcholkow;
            krawedzie[ostatni][1] = liczba_wierzcholkow, krawedzie[liczba_wierzcholkow][0] = (roznica+1)<<1;
            ostatni = liczba_wierzcholkow;
        }
    ++liczba_wierzcholkow;
    krawedzie[2][0] = krawedzie[3][0] = liczba_wierzcholkow;
    krawedzie[2][1] = krawedzie[3][1] = 0;

    std::cout << liczba_wierzcholkow << '\n';
    for(int i = 1; i <= liczba_wierzcholkow; ++i)
        std::cout << (krawedzie[i][0] ? krawedzie[i][0] : -1) << ' ' << (krawedzie[i][1] ? krawedzie[i][1] : -1) << '\n';

    return 0;
}