/*題意:求左右相串連後的 最長上升子序列,記錄路徑 解析:排序預先處理 + DP + 記錄路徑 */ #include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;#define manx 1009struct node { int left,right; int pos; //前驅 }x[manx];int dp[manx],pre[manx],g[manx];bool comp(const node&a,const node&b){ return a.right<b.right || a.right==b.right && a.left<a.left;}int main(){ int n; while(cin>>n,n){ memset(dp,0,sizeof(dp)); memset(pre,-1,sizeof(pre)); for(int i=0;i<n;i++){ cin>>x[i].left>>x[i].right; x[i].pos = i; } sort(x,x+n,comp); //預先處理 dp[0] = 1; for(int i=1;i<n;i++){ dp[i] = 1; for(int j=0;j<i;j++){ if(x[i].left>x[j].right && dp[j]+1>dp[i]){ pre[x[i].pos] = x[j].pos; dp[i] = dp[j]+1; } } } int ans = 0, pos = -1; for(int i=0;i<n;i++) if(dp[i]>ans) ans = dp[i], pos = x[i].pos; int num=0; g[++num] = pos; while(pre[pos]>=0) { pos = pre[pos]; g[++num] = pos; } for(int i=num;i>=1;i--) { if(i==num) cout<<g[i]+1; else cout<<" "<<g[i]+1; } cout<<endl; }}