#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<vector>
#include<utility>
#include<cstring>
using namespace std;

int x[6000];
int y[6000];
bool mark[6000];
int sol[6000];
int MIN=1 << 25;
int MAX=0;
int posmax,posmin;
int n;



int findL()
{
    posmax=0;
    posmin=0;
    MIN=1 << 25;
    MAX=0;
    for (int i=1;i<=n;i++) if (!mark[i])
    {
        if (x[i]>MAX)
        {
            MAX=x[i];
            posmax=i;
        }
        else if ((x[i]==MAX) && (y[i]<y[posmax]))
        {
            posmax=i;
        }



        if (x[i]<MIN)
        {
            MIN=x[i];
            posmin=i;
        }
     else if ( (x[i]==MIN) && (y[i]<y[posmin]))
                 {

                   posmin=i;
                 }

    }
if (y[posmin]<=y[posmax]) return posmin;
return posmax;
}



int findU()
{
    posmax=0;
    posmin=0;
    MIN=1 << 25;
    MAX=0;
    for (int i=1;i<=n;i++) if (!mark[i])
    {
        if (x[i]>MAX)
        {
            MAX=x[i];
            posmax=i;
        }
        else if ((x[i]==MAX) && (y[i]>y[posmax]))
        {
            posmax=i;
        }



        if (x[i]<MIN)
        {
            MIN=x[i];
            posmin=i;
        }
     else if ( (x[i]==MIN) && (y[i]>y[posmin]))
                 {

                   posmin=i;
                 }

    }
if (y[posmin]>=y[posmax]) return posmin;
return posmax;
}

int main()
{
   freopen("flojd.in","r",stdin);
    freopen("flojd.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d %d",&x[i],&y[i]);

    for (int i=1;i<=n;i++)
    {
        int first;
        if (i%2==1)
        {
            first=findL();
        }
        else first=findU();
        mark[first]=true;
        printf("%d\n",first);
        }
    return 0;
}



