#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long ll;
const int N=5000005;
const int MAXVI=10000;
int n,op_lim;
struct Car
{
int x,v,id;
}t[N];
ll c[N];
void add(int x)
{
for(int i=x;i<=MAXVI;i+=lowbit(i)) c[i]++;
}
ll Ans(int x)
{
ll ans=0;
for(int i=x;i;i-=lowbit(i)) ans=(ans+c[i])%1000000;
return ans;
}
int rk[N];
struct Heap
{
int s,t;
double T;
bool operator < (const Heap &Checker) const
{
if(Checker.T==T) return rk[Checker.s]<rk[s];
return Checker.T<T;
}
};
priority_queue<Heap> q;
int main()
{
scanf("%d",&n);
ll Pair=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&t[i].x,&t[i].v);
t[i].id=rk[i]=i;
Pair=(Pair+Ans(MAXVI)-Ans(t[i].v))%1000000;
add(t[i].v);
if(i!=1 && t[i-1].v>t[i].v)
q.push((Heap){i-1,i,(double)(t[i].x-t[i-1].x)/(t[i-1].v-t[i].v)});
}
printf("%lld\n",Pair);
while(op_lim<10000 && !q.empty())
{
int ss=q.top().s,tt=q.top().t; q.pop();
if(rk[ss]+1!=rk[tt]) continue;
int rs=rk[ss],rt=rk[tt];
++op_lim;
printf("%d %d\n",ss,tt);
swap(t[rs],t[rt]);
swap(rk[ss],rk[tt]); swap(rs,rt);
if(rs<n && t[rs].v>t[rs+1].v)
{
int c1=t[rs].id,c2=t[rs+1].id;
q.push((Heap){c1,c2,(double)1.0*(t[c2].x-t[c1].x)/(t[c1].v-t[c2].v)});
}
if(rt>1 && t[rt-1].v>t[rt].v)
{
int c1=t[rt-1].id,c2=t[rt].id;
q.push((Heap){c1,c2,(double)1.0*(t[c2].x-t[c1].x)/(t[c1].v-t[c2].v)});
}
}
}