#include<iostream>
// 排序后 找出第一个活动点的结束点 与后一个点的开始时间进行比较 如果该点的结束时间是大于等于下一个点的开始时间 加入集合
using namespace std;
//bool A[11];
//int s[11];
//int f[11];
//void GreedySelect(int s[],int f[],bool A[]);
//
//int main()
//{
// int i;
// for(i=1;i<=11;i++)cin>>s[i];
// for(i=1;i<=11;i++)cin>>f[i];
// GreedySelect(s,f,A);
//}
//
//void GreedySelect(int s[],int f[],bool A[])
//{
// A[1]=true; //已经被排序好的开始时间 第一个开始时间就是最优的
// int j=1;
// for(int i=2;i<=11;i++)
// {
// if(s[i]>=f[j]) //第二个开始时间>=第一个结束时间 说明该事件是相容的 可以加入最有结构
// {
// A[i]=true;
// j=i; //结束时间进行交替 开始下一次计算
// }
// else
// A[i] = false;
//
// }
// for(int i=1;i<=11;i++)
// {
// if(A[i]==true)
// cout<<i<<" ";
// }
//}
#include<algorithm>
const int MAX =1e8;
int n;
struct activity
{
int id;
int s;
int f;
int vis;
};
activity arr[MAX];
bool cmp(activity a,activity b) // 小的在前面 大的在后面
{
return a.f<b.f;
}
void solve()
{
int finishtime=0;
for(int i=1;i<=n;i++)
{
if(arr[i].s>=finishtime)
{
arr[i].vis = 1;
finishtime = arr[i].f;
}
}
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
{
arr[i].id=i;
cin>>arr[i].s;
cin>>arr[i].f;
arr[i].vis=0;
}
sort(arr+1,arr+1+n,cmp);
solve();
for(int i=1;i<=n;i++)
{
if(arr[i].vis == 1)
{
cout << arr[i].id << " ";
}
}
}
排序后 找出第一个活动点的结束点 与后一个点的开始时间进行比较 如果该点的结束时间是大于等于下一个点的开始时间 加入集合