1 #include <bits/stdc++.h>
2 using namespace std;
3 const int INF = 0x3f3f3f3f;
4 const int maxn = 100010;
5 const int mod = 1000000;
6 struct SplayTree {
7 int val[maxn],fa[maxn],ch[maxn][2];
8 int root,tot;
9 void init() {
10 root = tot = fa[0] = 0;
11 ch[0][0] = ch[0][1] = 0;
12 }
13 void newnode(int &x,int key,int f) {
14 val[x = ++tot] = key;
15 fa[x] = f;
16 ch[x][0] = ch[x][1] = 0;
17 }
18 void rotate(int x,int kd) {
19 int y = fa[x];
20 ch[y][kd^1] = ch[x][kd];
21 fa[ch[x][kd]] = y;
22 fa[x] = fa[y];
23 fa[y] = x;
24 ch[x][kd] = y;
25 if(fa[x]) ch[fa[x]][y == ch[fa[x]][1]] = x;
26 }
27 void Splay(int x,int goal) {
28 while(fa[x] != goal) {
29 if(fa[fa[x]] == goal) rotate(x,x == ch[fa[x]][0]);
30 else {
31 int y = fa[x],z = fa[y],s = (ch[z][0] == y);
32 if(x == ch[y][s]) {
33 rotate(x,!s);
34 rotate(x,s);
35 } else {
36 rotate(y,s);
37 rotate(x,s);
38 }
39 }
40 }
41 if(!goal) root = x;
42 }
43 void insert(int key) {
44 if(!root) {
45 newnode(root,key,0);
46 return;
47 }
48 int x = root;
49 while(ch[x][val[x] < key]) x = ch[x][val[x] < key];
50 newnode(ch[x][val[x] < key],key,x);
51 Splay(tot,0);
52 }
53 int precursor(int key) {
54 int ret = -INF,x = root;
55 while(x) {
56 if(val[x] <= key) {
57 ret = x;
58 x = ch[x][1];
59 } else x = ch[x][0];
60 }
61 return ret;
62 }
63 int sucessor(int key) {
64 int x = root,ret = INF;
65 while(x) {
66 if(val[x] >= key) {
67 ret = x;
68 x = ch[x][0];
69 } else x = ch[x][1];
70 }
71 return ret;
72 }
73 void delNode(int x) {
74 Splay(x,0);
75 if(ch[x][0] || ch[x][1]) {
76 if(!ch[x][0]) fa[root = ch[x][1]] = 0;
77 if(!ch[x][1]) fa[root = ch[x][0]] = 0;
78 if(ch[x][0] && ch[x][1]) {
79 int y = ch[x][0];
80 while(ch[y][1]) y = ch[y][1];
81 Splay(y,x);
82 ch[y][1] = ch[x][1];
83 fa[root = y] = 0;
84 fa[ch[x][1]] = y;
85 }
86 } else root = 0;
87 }
88 int Find(int key) {
89 int x = root;
90 while(x) {
91 if(val[x] == key) return x;
92 x = ch[x][val[x] < key];
93 }
94 return 0;
95 }
96 } spt;
97 int main() {
98 spt.init();
99 int n,kind,k,tkind = -1,ret = 0;
100 scanf("%d",&n);
101 for(int i = 1; i <= n; ++i) {
102 scanf("%d%d",&kind,&k);
103 if(!spt.root || kind == tkind) {
104 tkind = kind;
105 spt.insert(k);
106 } else {
107 int root = spt.Find(k);
108 if(root) {
109 spt.delNode(root);
110 continue;
111 }
112 int a = spt.precursor(k),aa;
113 int b = spt.sucessor(k),bb;
114 if(a != -INF) aa = spt.val[a];
115 else aa = INF;
116 if(b != INF) bb = spt.val[b];
117 else bb = INF;
118 if(abs(aa - k) <= abs(bb - k)){
119 ret = (ret + abs(aa - k))%mod;
120 spt.delNode(a);
121 }else{
122 ret = (ret + abs(bb - k))%mod;
123 spt.delNode(b);
124 }
125 }
126 }
127 printf("%d\n",ret);
128 return 0;
129 }