OI XXXI - zap

// https://szkopul.edu.pl/problemset/problem/CNaWaG3_YWfd96Qi6T36RnO0/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector
#define ca const auto

typedef long long ll;
typedef vec<vec<int>> _kra;
typedef ar<int, 3> Trio;
typedef ar<int, 2> Duo;

Duo ans[sizik], _in[sizik];
bool visited[sizik];

void solve() {
    int n;
    std::cin >> n;

    // [p, k, i]
    std::vector<Trio> v(n);
    int j = 0;
    for (auto& [p, k, i] : v) {
        std::cin >> p >> k;
        i = ++j;
        _in[i] = {p, k};
    }

    std::sort(v.begin(), v.end(), [](ca& a, ca& b) {
        if (a[1] > b[1]) {
            return false;
        } else if (a[1] == b[1]) {
            return a[0] < b[0];
        } else {
            return true;
        }
    });

    int last_u = 0, last_v = 0, z = 0, p1 = 0, p2 = 0, curr = 0;

    while ((int)v.size() > 0) {
        if (z == 0) {
            int i1 = -1;
            for (; p1 < (int)v.size(); p1++) {
                if (!visited[p1] && v[p1][0] >= last_v && v[p1][0] >= last_u) {
                    visited[p1] = true;
                    ans[++curr][0] = v[p1][2];
                    i1 = 0;
                    break;
                }
            }

            z = 1;

            if (i1 == -1) break;
        } else if (z == 1) {
            int i1 = -1;
            for (; p2 < (int)v.size(); p2++) {
                if (!visited[p2] && v[p2][0] >= last_u) {
                    visited[p2] = true;
                    ans[curr][1] = v[p2][2];
                    i1 = 0;

                    last_v = _in[ans[curr][1]][1];
                    last_u = _in[ans[curr][0]][1];

                    break;
                }
            }

            z = 0;

            if (i1 == -1) break;
        }
    }

    if (ans[curr][1] == 0) {
        curr--;
    }

    std::vector<int> ans2{v[0][2]};

    for (int i = 1; i < n; i++) {
        if (_in[ans2[ans2.size() - 1]][1] <= v[i][0]) {
            ans2.push_back(v[i][2]);
        } else {
        }
    }

    ans2.push_back(n + 1);
    _in[n + 1] = {INT_MAX, INT_MAX};

    int NewV = 0;
    ans2.pop_back();

    if (NewV == 0) {
        NewV = ans2[ans2.size() - 1];
        ans2.pop_back();
    }

    if ((int)ans2.size() > curr) {
        std::cout << ans2.size() << '\n';

        for (int i = 0; i < ans2.size(); i++) {
            std::cout << ans2[i] << " " << NewV << '\n';
        }

    } else {
        std::cout << curr << '\n';

        for (int i = 1; i <= curr; i++) {
            std::cout << ans[i][0] << " " << ans[i][1] << '\n';
        }
    }
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}