#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <limits.h>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
iostream::sync_with_stdio(0);
cin.tie(0);
int n, i, gold, slave;
cin >> n >> gold >> slave;
vector<set<pair<int, int>>> cantgotogethere = { { {0, 0} }, { {gold, slave} } };
map<pair<int, int>, int> citys;
citys[{ gold, slave }] = 0;
for (i = 1; i < n; i++)
{
cin >> gold >> slave;
citys[{gold, slave}] = i;
int left = 1, right = cantgotogethere.size() - 1, m;
while (left < right)
{
m = (right + left) >> 1;
auto pointer = cantgotogethere[m].lower_bound({ gold, slave });
if (pointer != cantgotogethere[m].begin() && prev(pointer).operator*().second < slave && prev(pointer).operator*().first < gold)
{
left = m + 1;
}
else
{
right = m;
}
}
auto pointer = cantgotogethere[left].lower_bound({ gold, slave });
if (pointer != cantgotogethere[left].begin() && prev(pointer).operator*().second < slave && prev(pointer).operator*().first < gold)
{
cantgotogethere.push_back({ {gold, slave} });
}
else
{
while (pointer != cantgotogethere[left].end() && pointer.operator*().second > slave)
{
cantgotogethere[left].erase(*pointer);
pointer = cantgotogethere[left].lower_bound({ gold, slave });
}
cantgotogethere[left].insert({ gold, slave });
}
}
cout << cantgotogethere.size() - 1 << '\n';
vector<int> out;
out.reserve(cantgotogethere.size());
pair<int, int> last = *cantgotogethere.back().begin();
out.push_back(citys[{gold, slave}]);
i = cantgotogethere.size() - 2;
while (i > 0)
{
auto pointer = prev(cantgotogethere[i].lower_bound(last));
out.push_back(citys[*pointer]);
last = *pointer;
i--;
}
for (i = out.size()-1; i > -1; i--)
{
cout << out[i] + 1 << ' ';
}
}