#include<bits/stdc++.h>
#define inf 2147483647
using namespace std;
struct fhq{
#define maxn 80005
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
struct edge{
int val,siz,ls,rs,key;
}tr[maxn];
int cnt=0,x,y,rt;
int newnode(int val){
tr[++cnt].key=rand();
tr[cnt].val=val;
tr[cnt].siz=1;
return cnt;
}
void pushup(int now){
tr[now].siz=tr[ls(now)].siz+tr[rs(now)].siz+1;
}
void split(int now,int val,int &x,int &y){
if(!now){
x=y=0;
return;
}
if(tr[now].val<=val){
x=now;
split(rs(now),val,rs(now),y);
}
else{
y=now;
split(ls(now),val,x,ls(now));
}
pushup(now);
}
int merge(int xx,int yy){
if(!xx||!yy)return xx^yy;
if(tr[xx].key<tr[yy].key){
rs(xx)=merge(rs(xx),yy);
pushup(xx);
return xx;
}
else{
ls(yy)=merge(xx,ls(yy));
pushup(yy);
return yy;
}
}
void add(int val){
split(rt,val,x,y);
rt=merge(merge(x,newnode(val)),y);
}
void de(int val){
split(rt,val,x,y);
int z;
split(x,val-1,x,z);
z=merge(ls(z),rs(z));
rt=merge(merge(x,z),y);
}
int getf(int val){
split(rt,val-1,x,y);
int now=x;
while(rs(now))now=rs(now);
rt=merge(x,y);
return tr[now].val;
}
int getb(int val){
split(rt,val,x,y);
int now=y;
while(ls(now))now=ls(now);
rt=merge(x,y);
return tr[now].val;
}
void build(){
add(inf);
add(-inf);
}
int sizee(){
return tr[rt].siz-2;
}
}mas,pe;
int main(){
int n,ans=0;
scanf("%d",&n);
mas.build();
pe.build();
for(int i=1;i<=n;i++){
int op,val;
scanf("%d%d",&op,&val);
if(op){
if(mas.sizee()<pe.sizee()){
int fr=pe.getf(val+1),ba=pe.getb(val-1);
if(abs(val-fr)>abs(val-ba)){
pe.de(ba);
ans+=ba-val;
}
else{
pe.de(fr);
ans+=val-fr;
}
}
else mas.add(val);
}
else{
if(pe.sizee()<mas.sizee()){
int fr=mas.getf(val),ba=mas.getb(val);
if(abs(val-fr)>abs(val-ba)){
mas.de(ba);
ans+=ba-val;
}
else{
mas.de(fr);
ans+=val-fr;
}
}
else pe.add(val);
}
ans%=1000000;
}
printf("%d",ans);
return 0;
}