#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1000000;
class FHQ_Treap {
private:
struct fhq_treap {
int l, r, key, val;
} tr[200005];
int root, tot, x, y, z;
int get_new(int v) {
tr[++tot].key = v;
tr[tot].val = rand();
return tot;
}
void split(int o, int v, int &x, int &y) {
if (!o) x = y = 0;
else {
if (tr[o].key <= v) x = o, split(tr[o].r, v, tr[o].r, y);
else y = o, split(tr[o].l, v, x, tr[o].l);
}
}
int merge(int x, int y) {
if (!x || !y) return x + y;
if (tr[x].val > tr[y].val) {
tr[x].r = merge(tr[x].r, y);
return x;
} else {
tr[y].l = merge(x, tr[y].l);
return y;
}
}
void insert(int v) {
split(root, v, x, y);
root = merge(merge(x, get_new(v)), y);
}
void remove(int v) {
split(root, v, x, z);
split(x, v - 1, x, y);
y = merge(tr[y].l, tr[y].r);
root = merge(merge(x, y), z);
}
int get_pre(int v) {
split(root, v - 1, x, y);
int o = x;
while (tr[o].r) o = tr[o].r;
int ans = tr[o].key;
root = merge(x, y);
return ans;
}
int get_nxt(int v) {
split(root, v, x, y);
int o = y;
while (tr[o].l) o = tr[o].l;
int ans = tr[o].key;
root = merge(x, y);
return ans;
}
public:
bool empty() {
return root == 0;
}
void ins(int v) {
insert(v);
}
void del(int v) {
remove(v);
}
int pre(int v) {
return get_pre(v);
}
int nxt(int v) {
return get_nxt(v);
}
} fhq[2];
int n, ans;
signed main() {
cin >> n;
while (n--) {
int op, x;
cin >> op >> x;
int a = fhq[op ^ 1].pre(x), b = fhq[op ^ 1].nxt(x);
if (a == 0 && b == 0) fhq[op].ins(x);
else if (a != 0 && x - a <= b - x) {
(ans += x - a) %= mod;
fhq[op ^ 1].del(a);
} else if (b != 0) {
(ans += b - x) %= mod;
fhq[op ^ 1].del(b);
}
}
cout << ans % mod << endl;
return 0;
}```