/*
DP 排序后,求最长递减子序列
*/
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
struct node {
int idx;
int w;
int iq;
};
node A[MAXN];
int n;
int d[MAXN];
int s[MAXN];
//最长递增子序列
void print(int len, int i)
{
if(len==0) return;
printf("%d\n", A[i].idx);
print(len-1, s[i]);
}
void dp()
{
int len = -1<<30, idx;
for(int i=n-1; i>=0; i--) {
d[i] = 1;
for(int j=i+1; j<n; j++) {
if(A[j].iq < A[i].iq && A[j].w != A[i].w && d[j]+1>d[i]) {
d[i] = d[j] + 1;
s[i] = j;
}
}
if(d[i] > len) {
len = d[i];
idx = i;
}
}
printf("%d\n", len);
print(len, idx);
}
bool cmp(node a, node b)
{
return a.w < b.w;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
n = 0;
while(scanf("%d%d", &A[n].w, &A[n].iq) == 2) {
A[n].idx = n+1;
n++;
}
sort(A, A+n, cmp);
dp();
return 0;
}
/*
最长递增子序列另一种方法 O(n*lgn)
*/
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
struct node {
int idx;
int w;
int iq;
};
node A[MAXN];
int n;
int M[MAXN];
int P[MAXN];
int l = 0;
int bs(int i)
{
int x = 1, y = l+1, m;
while(x < y) {
m = x + (y-x)/2;
if(A[M[m]].iq > A[i].iq && A[M[m]].w != A[i].w) {
x = m + 1;
} else {
y = m;
}
}
return x;
}
void print(int len, int i)
{
if(!len) return;
print(len-1, P[i]);
printf("%d\n", A[i].idx);
}
void solve(){
for(int i=0; i<n; i++) {
int j = bs(i) - 1;
P[i] = M[j];
if(j == l || A[M[j+1]].iq < A[i].iq) {
M[j+1] = i;
l = max(l, j+1);
}
}
printf("%d\n", l);
print(l, M[l]);
}
bool cmp(node a, node b)
{
return a.w < b.w;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
n = 0;
while(scanf("%d%d", &A[n].w, &A[n].iq) == 2) {
A[n].idx = n+1;
n++;
}
sort(A, A+n, cmp);
solve();
return 0;
}