#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
using namespace std;
int n,m,l=3;
struct node
{
int key,rev;
node *child[2];
} bst[20001],*root=NULL,*pos=bst;
queue<node*>mem;
void rotate(node* &r,bool t)
{
node *y=r->child[!t];
r->child[!t]=y->child[t];
y->child[t]=r;
r=y;
}
void newnode(node* &r,int key)
{
if(!mem.empty())r=mem.front(),mem.pop();
else r=pos++;
r->key=key;
r->rev=rand();
r->child[0]=r->child[1]=NULL;
}
void insert(node* &r,int key)
{
if(!r)newnode(r,key);
else
{
bool t=r->key<key;
insert(r->child[t],key);
if(r->rev>r->child[t]->rev)rotate(r,!t);
}
}
void delet(node* &r,int key)
{
if(!r)return;
if(r->key==key)
{
if(r->child[1]&&r->child[0])
{
bool t=r->child[0]->rev<r->child[1]->rev;
rotate(r,t);
delet(r->child[t],key);
}
else
{
mem.push(r);
if(r->child[0])r=r->child[0];
else r=r->child[1];
}
}
else delet(r->child[r->key<key],key);
}
int pre,nxt;
void getspre(node* r,int key)
{
if(r==NULL)return;
if(r->key>key)getspre(r->child[0],key);
else pre=r->key,getspre(r->child[1],key);
}
void getsnext(node* r,int key)
{
if(r==NULL)return;
if(r->key<key)getsnext(r->child[1],key);
else nxt=r->key,getsnext(r->child[0],key);
}
int main()
{
int i,j,k,ans=0;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d%d",&j,&k);
if(j==l||root==NULL)
{
insert(root,k);
l=j;
}
else if(j!=l)
{
pre=nxt=2000000000;
getspre(root,k);
getsnext(root,k);
if(abs(k-pre)>abs(k-nxt))
{
ans+=abs(k-nxt);
ans%=1000000;
delet(root,nxt);
}
else
{
ans+=abs(k-pre);
ans%=1000000;
delet(root,pre);
}
}
if(root==NULL)l=3;
}
cout<<ans;
return 0;
}