#include<bits/stdc++.h>
using namespace std;
struct Node{
int l,r,key,val,len;
}a[100001],b[100001];
const int md=1000000;
int tot=0,rot,rotb,totb;
long long ans;
void push_up(int p){
a[p].len=a[a[p].l].len+a[a[p].r].len+1;
}
void Push_up(int p){
b[p].len=b[b[p].l].len+b[b[p].r].len+1;
}
int merge(int rot1,int rot2){
if(rot1==0){
return rot2;
}
else if(rot2==0){
return rot1;
}
if(a[rot1].key<a[rot2].key){
a[rot1].r=merge(a[rot1].r,rot2);
push_up(rot1);
return rot1;
}
else{
a[rot2].l=merge(rot1,a[rot2].l);
push_up(rot2);
return rot2;
}
}
int Merge(int rot1,int rot2){
if(rot1==0){
return rot2;
}
else if(rot2==0){
return rot1;
}
if(b[rot1].key<b[rot2].key){
b[rot1].r=Merge(b[rot1].r,rot2);
Push_up(rot1);
return rot1;
}
else{
b[rot2].l=Merge(rot1,b[rot2].l);
Push_up(rot2);
return rot2;
}
}
void val_split(int now,int k,int &rot1,int &rot2){
if(now==0){
rot1=0;
rot2=0;
return;
}
else if(a[now].val<=k){
rot1=now;
val_split(a[rot1].r,k,a[rot1].r,rot2);
}
else{
rot2=now;
val_split(a[rot2].l,k,rot1,a[rot2].l);
}
push_up(now);
}
void Val_split(int now,int k,int &rot1,int &rot2){
if(now==0){
rot1=0;
rot2=0;
return;
}
else if(b[now].val<=k){
rot1=now;
Val_split(b[rot1].r,k,b[rot1].r,rot2);
}
else{
rot2=now;
Val_split(b[rot2].l,k,rot1,b[rot2].l);
}
Push_up(now);
}
void k_split(int now,int k,int &rot1,int &rot2){
if(now==0){
rot1=0;
rot2=0;
return;
}
push_up(now);
if(a[a[now].l].len<k){
rot1=now;
k_split(a[rot1].r,k-a[a[rot1].l].len-1,a[rot1].r,rot2);
}
else{
rot2=now;
k_split(a[rot2].l,k,rot1,a[rot2].l);
}
push_up(now);
}
void K_split(int now,int k,int &rot1,int &rot2){
if(now==0){
rot1=0;
rot2=0;
return;
}
Push_up(now);
if(b[b[now].l].len<k){
rot1=now;
K_split(b[rot1].r,k-b[b[rot1].l].len-1,b[rot1].r,rot2);
}
else{
rot2=now;
K_split(b[rot2].l,k,rot1,b[rot2].l);
}
Push_up(now);
}
void New_Node(int val){
a[++tot].key=rand()%114514+1;
a[tot].l=0;
a[tot].r=0;
int rot1,rot2,now=tot;
a[tot].len=1;
a[tot].val=val;
val_split(rot,val,rot1,rot2);
rot=merge(merge(rot1,now),rot2);
}
void new_Node(int val){
b[++totb].key=rand()%114514+1;
b[totb].l=0;
b[totb].r=0;
int rot1,rot2,now=totb;
b[totb].len=1;
b[totb].val=val;
Val_split(rotb,val,rot1,rot2);
rotb=Merge(Merge(rot1,now),rot2);
}
void Erase(int val){
int rot1,rot2,rot3,rot4;
val_split(rot,val-1,rot1,rot2);
k_split(rot2,1,rot3,rot4);
rot=merge(rot1,rot4);
}
void erase(int val){
int rot1,rot2,rot3,rot4;
Val_split(rotb,val-1,rot1,rot2);
K_split(rot2,1,rot3,rot4);
rotb=Merge(rot1,rot4);
}
int Find_k(int val){
int rot1,rot2;
val_split(rot,val-1,rot1,rot2);
int x=a[rot1].val;
rot=merge(rot1,rot2);
return x;
}
int find_k(int val){
int rot1,rot2;
Val_split(rotb,val-1,rot1,rot2);
int x=b[rot1].val;
rotb=Merge(rot1,rot2);
return x;
}
int Find_val(int k){
int rot1,rot2,rot3,rot4;
k_split(rot,k-1,rot1,rot2);
k_split(rot2,1,rot3,rot4);
int x=a[rot3].val;
rot=merge(rot1,merge(rot3,rot4));
return x;
}
int find_val(int k){
int rot1,rot2,rot3,rot4;
K_split(rotb,k-1,rot1,rot2);
K_split(rot2,1,rot3,rot4);
int x=b[rot3].val;
rotb=Merge(rot1,Merge(rot3,rot4));
return x;
}
int Find_last(int val){
int rot1,rot2,rot3,rot4;
val_split(rot,val-1,rot1,rot2);
k_split(rot1,a[rot1].len-1,rot3,rot4);
int x=a[rot4].val;
rot=merge(merge(rot3,rot4),rot2);
return x;
}
int find_last(int val){
int rot1,rot2,rot3,rot4;
Val_split(rotb,val-1,rot1,rot2);
K_split(rot1,b[rot1].len-1,rot3,rot4);
int x=b[rot4].val;
rotb=Merge(Merge(rot3,rot4),rot2);
return x;
}
int Find_next(int val){
int rot1,rot2,rot3,rot4;
val_split(rot,val,rot1,rot2);
k_split(rot2,1,rot3,rot4);
int x=a[rot3].val;
rot=merge(rot1,merge(rot3,rot4));
return x;
}
int find_next(int val){
int rot1,rot2,rot3,rot4;
Val_split(rotb,val,rot1,rot2);
K_split(rot2,1,rot3,rot4);
int x=b[rot3].val;
rotb=Merge(rot1,Merge(rot3,rot4));
return x;
}
int main(){
srand(time(NULL));
int n,js1=0,js2=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int op,val;
scanf("%d%d",&op,&val);
if(op==0){
js1++;
if(js2!=0){
js2--;
js1--;
int x1,x2;
x1=find_last(val);
x2=find_next(val);
if((abs(val-x1)<=abs(val-x1)&&x1!=0)||x2==0){
erase(x1);
ans+=abs(val-x1);
ans%=md;
}
else{
erase(x2);
ans+=abs(val-x2);
ans%=md;
}
continue;
}
New_Node(val);
}
else{
js2++;
if(js1!=0){
js1--;
js2--;
int x1,x2;
x1=Find_last(val);
x2=Find_next(val);
if((abs(val-x1)<=abs(val-x1)&&x1!=0)||x2==0){
Erase(x1);
ans+=abs(val-x1);
ans%=md;
}
else{
Erase(x2);
ans+=abs(val-x2);
ans%=md;
}
continue;
}
new_Node(val);
}
}
printf("%lld",ans);
return 0;
}