1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<cstdlib> 7 #include<fstream> 8 using namespace std; 9 //ifstream fin("fin.in"); 10 //ofstream fout("test.out"); 11 12 long long n,ans=0; 13 typedef struct{ 14 int tot,root,key[100000],pre[100000],ch[100000][2]; 15 }Node; 16 Node N[2]; 17 18 void Newnode(int k,int &num,int father,int d){ 19 num=++N[k].tot;N[k].key[num]=d;N[k].pre[num]=father; 20 N[k].ch[num][0]=N[k].ch[num][1]=0;return ; 21 } 22 23 void Rotate(int k,int x,int kind){ 24 int y=N[k].pre[x]; 25 N[k].ch[y][!kind]=N[k].ch[x][kind]; 26 N[k].pre[N[k].ch[y][!kind]]=y; 27 28 if(N[k].pre[y]) N[k].ch[N[k].pre[y]][y==N[k].ch[N[k].pre[y]][1]]=x; 29 N[k].pre[x]=N[k].pre[y]; 30 31 32 N[k].pre[y]=x; 33 N[k].ch[x][kind]=y; 34 35 return ; 36 } 37 38 void Splay(int k,int x,int goal){ 39 while(N[k].pre[x]!=goal) 40 { 41 int y=N[k].pre[x]; 42 if(N[k].pre[y]==goal) Rotate(k,x,N[k].ch[y][0]==x); 43 else 44 { 45 int z=N[k].pre[y];int kind=N[k].ch[z][0]==y; 46 if(N[k].ch[y][!kind]==x) {Rotate(k,y,kind);Rotate(k,x,kind);} 47 else {Rotate(k,x,!kind);Rotate(k,x,kind);} 48 } 49 } 50 N[k].root=x;return ; 51 52 } 53 54 int Insert(int k,int d){//return 1 则找到相等于d的节点 55 if(N[k].root==0) {Newnode(k,N[k].root,0,d);return 0;}// 56 int x=N[k].root; 57 while(N[k].ch[x][N[k].key[x]<d]) 58 { 59 if(N[k].key[x]==d) {Splay(k,x,0);return 1;} 60 x=N[k].ch[x][N[k].key[x]<d]; 61 } 62 if(N[k].key[x]==d) {Splay(k,x,0);return 1;} 63 64 Newnode(k,N[k].ch[x][N[k].key[x]<d],x,d); 65 Splay(k,N[k].ch[x][N[k].key[x]<d],0); 66 return 0; 67 } 68 69 int Pre(int k,int root){ 70 if(N[k].ch[root][0]==0) return 0; 71 int x=N[k].ch[root][0]; 72 while(N[k].ch[x][1]) 73 x=N[k].ch[x][1]; 74 return x; 75 } 76 77 int Next(int k,int root){ 78 if(N[k].ch[root][1]==0) return 0; 79 int x=N[k].ch[root][1]; 80 while(N[k].ch[x][0]) 81 x=N[k].ch[x][0]; 82 return x; 83 } 84 85 86 int a,b; 87 void Change(int k,int c){ //删除root,splay c 88 int y=N[k].ch[N[k].root][1]; 89 N[k].ch[a][1]=y; 90 N[k].pre[y]=a; 91 92 N[k].root=N[k].ch[N[k].root][0]; 93 N[k].pre[N[k].root]=0; 94 95 Splay(k,c,0); 96 } 97 int Union(int k,int d){//合并root的两子树,并求值 98 a=Pre(k,N[k].root); 99 b=Next(k,N[k].root); 100 101 //cout<<N[k] 102 103 // cout<<"pre "<<N[k].key[a]<<endl; 104 // cout<<"next "<<N[k].key[b]<<endl; 105 if(a==0) 106 { 107 ans+=abs(N[k].key[b]-d);ans%=1000000; 108 // N[k].ch[N[k].pre[b]][N[k].key[N[k].pre[b]]<N[k].key[b]]=0; 109 N[k].root=N[k].ch[N[k].root][1]; 110 N[k].pre[N[k].root]=0; 111 Splay(k,b,0); 112 N[k].root=N[k].ch[N[k].root][1]; 113 N[k].pre[N[k].root]=0; 114 return 0; 115 } 116 else if(b==0) 117 { 118 ans+=abs(N[k].key[a]-d);ans%=1000000; 119 //N[k].ch[N[k].pre[a]][N[k].key[N[k].pre[a]]<N[k].key[a]]=0; 120 N[k].root=N[k].ch[N[k].root][0]; 121 N[k].pre[N[k].root]=0; 122 Splay(k,a,0); 123 N[k].root=N[k].ch[N[k].root][0]; 124 N[k].pre[N[k].root]=0; 125 return 0; 126 } 127 else 128 { 129 ans+=min(abs(N[k].key[a]-d),abs(N[k].key[b]-d));ans%=1000000; 130 if((abs(N[k].key[a]-d)==abs(N[k].key[b]-d)&&N[k].key[a]<N[k].key[b])||abs(N[k].key[a]-d)<abs(N[k].key[b]-d)) 131 {Change(k,a);return 1;}///splay a,删除a 132 else {Change(k,b);return 1;} 133 } 134 } 135 136 void Print(int k,int x){ 137 cout<<N[k].key[x]<<" "<<N[k].key[N[k].pre[x]]<<endl; 138 if(N[k].ch[x][0]) Print(k,N[k].ch[x][0]); 139 if(N[k].ch[x][1]) Print(k,N[k].ch[x][1]); 140 } 141 142 void Delete(int k,int d){ 143 if(Insert(k,d)) 144 { 145 a=Pre(k,N[k].root); 146 if(a==0) 147 { 148 N[k].root=N[k].ch[N[k].root][1]; 149 N[k].pre[N[k].root]=0; 150 } 151 else 152 Change(k,a); 153 154 return ; 155 } 156 157 // cout<<"k "<<k<<" "<<d<<endl; 158 // Print(k,N[k].root); 159 // 160 if(Union(k,d)) 161 { 162 a=Pre(k,N[k].root); 163 if(a==0) 164 { 165 N[k].root=N[k].ch[N[k].root][1]; 166 N[k].pre[N[k].root]=0; 167 } 168 else 169 Change(k,a); 170 } 171 //cout<<ans<<" ans"<<endl; 172 } 173 174 int main() 175 { 176 cin>>n; 177 N[0].tot=N[1].tot=N[0].root=N[1].root=0; 178 179 for(int i=1;i<=n;++i) 180 { 181 int x,y; 182 cin>>x>>y; 183 184 if(x==0) {if(N[1].root==0) Insert(0,y);else Delete(1,y);} 185 if(x==1) {if(N[0].root==0) Insert(1,y);else {Delete(0,y);}}//Print(0,N[0].root); 186 // cout<<N[0].root<<" "<<N[1].root<<endl; 187 // cout<<ans<<endl; 188 } 189 190 cout<<ans<<endl; 191 // system("pause"); 192 return 0; 193 194 }