splay模板题 调了好久啊TAT
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
int ch[80005][2];
int fa[80005];
int val[80005];
int cn[80005];
int cnt, cn1, cn2, rt;
void clear(int x)
{
ch[x][0] = ch[x][1] = val[x] = fa[x] = cn[x] = 0;
}
bool ws(int s)
{
return ch[fa[s]][1] == s;
}
void setfa(int s, int f, int d)
{
if(s != 0) fa[s] = f;
if(f != 0) ch[f][d] = s;
}
void rot(int x)
{
int f = fa[x]; int ff = fa[f]; int d1 = ws(x); int d2 = ws(f);
int p = ch[x][d1 ^ 1];
setfa(x, ff, d2);
setfa(p, f, d1);
setfa(f, x, d1 ^ 1);
}
void splay(int x)
{
for(; fa[x]; rot(x))
if(fa[fa[x]] && ws(x) == ws(fa[x])) rot(fa[x]);
rt = x;
}
void inser(int x)
{
if(rt == 0)
{
cnt++;
val[cnt] = x;
fa[cnt] = ch[cnt][0] = ch[cnt][1] = 0;
rt = cnt;
return;
}
int now = rt, f = 0;
while(1)
{
if(x == val[now])
{
cn[now]++;
splay(now);
break;
}
f = now;
now = ch[now][val[now] < x];
if(now == 0)
{
cnt++;
cn[cnt] = 1;
fa[cnt] = f;
ch[f][val[f] < x] = cnt;
ch[cnt][1] = ch[cnt][0] = 0;
val[cnt] = x;
splay(cnt);
break;
}
}
}
int pre()
{
int now = ch[rt][0];
while(ch[now][1]) now = ch[now][1];
return now;
}
int nex()
{
int now = ch[rt][1];
while(ch[now][0]) now = ch[now][0];
return now;
}
int ffind(int v)
{
int now = rt;
while(1)
{
if(val[now] > v) now = ch[now][0];
else
{
if(val[now] == v)
{
splay(now);
return now;
}
now = ch[now][1];
}
}
}
void del(int x)
{
int no = ffind(x);
if(cn[rt] > 1)
{
cn[rt]--;
return;
}
if(!ch[rt][1] && !ch[rt][0])
{
clear(rt);
rt = 0;
return;
}
if(!ch[rt][1])
{
int oldrt = rt;
rt = ch[rt][0]; fa[rt] = 0;
clear(oldrt);
return;
}
if(!ch[rt][0])
{
int oldrt = rt;
rt = ch[rt][1]; fa[rt] =0;
clear(oldrt);
return;
}
int lrt = pre();
int oldrt = rt;
splay(lrt);
fa[ch[oldrt][1]] = lrt;
ch[rt][1] = ch[oldrt][1];
clear(oldrt);
}
int main()
{
cnt = cn1 = cn2 = rt = 0;
int T;
scanf("%d", &T);
int ans = 0;
while(T--)
{
int a, b;
scanf("%d%d", &a, &b);
inser(b);
if(a == 0)
{
if(cn2 == 0) cn1++;
else
{
if(cn[rt] == 2)
{
del(b);
del(b);
}
else
{
int u = ch[rt][0] ? val[pre()] : 0;
int v = ch[rt][1] ? val[nex()] : 0;
if(u == 0)
{
ans = (ans + v - b) % 1000000;
del(b);
del(v);
}
else if(v == 0)
{
ans = (ans + b - u) % 1000000;
del(b);
del(u);
}
else if(abs(b - u) <= abs(b - v))
{
ans = (ans + abs(b - u)) % 1000000;
del(b);
del(u);
}
else if(abs(b - u) > abs(b - v))
{
ans = (ans + abs(b - v)) % 1000000;
del(b);
del(v);
}
}
cn2--;
}
}
else if(a == 1)
{
if(cn1 == 0) cn2++;
else
{
if(cn[rt] == 2)
{
del(b);
del(b);
}
else
{
int u = ch[rt][0] ? val[pre()] : 0;
int v = ch[rt][1] ? val[nex()] : 0;
if(u == 0)
{
ans = (ans + v - b) % 1000000;
del(b);
del(v);
}
else if(v == 0)
{
ans = (ans + b - u) % 1000000;
del(b);
del(u);
}
else if(abs(b - u) <= abs(b - v))
{
ans = (ans + abs(b - u)) % 1000000;
del(b);
del(u);
}
else if(abs(b - u) > abs(b - v))
{
ans = (ans + abs(b - v)) % 1000000;
del(b);
del(v);
}
}
cn1--;
}
}
}
printf("%d\n", ans);
return 0;
}