#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,MOD=1000000,inf=0x33f3f3f;
class fhqtql{
public:
struct node{
int ls,rs;
int x,rnd,size;
}tr[N];
int tot=0,root=0;
int newNode(int x){
tr[++tot]={0,0,x,rand(),1};
return tot;
}
inline void pushuup(int x){
tr[x].size=tr[tr[x].ls].size+tr[tr[x].rs].size+1;
}
void split(int u,int &x,int &y,int val){
if(!u){
x=0,y=0;
return;
}
if(tr[u].x<=val){
x=u;
split(tr[x].rs,tr[x].rs,y,val);
}
else{
y=u;
split(tr[y].ls,x,tr[y].ls,val);
}
pushuup(u);
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(tr[x].rnd<tr[y].rnd){
tr[x].rs=merge(tr[x].rs,y);
pushuup(x);
return x;
}
else{
tr[y].ls=merge(x,tr[y].ls);
pushuup(y);
return y;
}
}
void insert(int x){
int l,r;
split(root,l,r,x);
root=merge(l,merge(newNode(x),r));
}
void del(int x){
int l,r,xx,yy;
split(root,l,r,x);
split(l,xx,yy,x-1);
yy=merge(tr[yy].ls,tr[yy].rs);
root=merge(merge(xx,yy),r);
}
int kth(int u,int k){
int p=tr[tr[u].ls].size+1;
if(p==k) return tr[u].x;
if(p>k) return kth(tr[u].ls,k);
return kth(tr[u].rs,k-p);
}
int getPre(int x){
int l,r;
split(root,l,r,x);
int tmp=kth(l,tr[l].size);
root=merge(l,r);
return tmp;
}
int getNxt(int x){
int l,r;
split(root,l,r,x-1);
int tmp=kth(r,1);
root=merge(l,r);
return tmp;
}
int size(){
return tr[root].size;
}
fhqtql(){
insert(inf),insert(-inf);
}
};
fhqtql pet,man;
int n,ans=0;
int main(){
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
if(a==0){
if(pet.size()>man.size()){
pet.insert(b);
}
else{
int x=man.getNxt(b),y=man.getPre(b);
if(abs(x-b)<abs(y-b)&&x!=inf){
man.del(x);
ans+=abs(x-b);
}
else if(y!=-inf){
man.del(y);
ans+=abs(y-b);
}
ans%=MOD;
}
}
else{
if(pet.size()<man.size()) man.insert(b);
else{
int x=pet.getNxt(b),y=pet.getPre(b);
if(abs(x-b)<abs(y-b)&&x!=inf){
pet.del(x);
ans+=abs(x-b);
}
else if(y!=-inf){
pet.del(y);
ans+=abs(y-b);
}
ans%=MOD;
}
}
}
cout<<ans;
}