Problem B
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf LONG_LONG_MAX
const int N = 1e5 + 10;
int n, q, x, mn = inf, mx;
map <int, int> tr;
int lowerbit(int x)
{
return x & (-x);
}
void update(int x, int y)
{
for(int i = x; i <= 1e9; i += lowerbit(i))
{
tr[i] += y;
}
}
int qianzhui(int x)
{
int ret = 0;
for(int i = x; i >= 1; i -= lowerbit(i))
{
ret += tr[i];
}
return ret;
}
int query(int x, int y)
{
return qianzhui(y) - qianzhui(x - 1);
}
int pe(int x)
{
int l = 0, r = x, ans = -2;
int y = qianzhui(x) - 1;
while(l <= r)
{
int mid = (l + r) >> 1;
if(qianzhui(mid) < y)
{
ans = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
return ans;
}
int nt(int x)
{
int l = x, r = 1e9, ans = inf;
int y = qianzhui(x);
while(l <= r)
{
int mid = (l + r) >> 1;
if(qianzhui(mid) > y)
{
ans = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
return ans;
}
signed main()
{
freopen("secret.in", "r", stdin);
freopen("secret.out", "w", stdout);
cin >> n >> q;
for(int i = 1; i <= n; i++)
{
cin >> x;
update(x, 1);
mn = min(mn, x);
mx = max(mx, x);
}
while(q--)
{
char op;
cin >> op;
if(op == '+')
{
cin >> x;
update(x, 1);
mn = min(mn, x);
mx = max(mx, x);
}
else if(op == '-')
{
cin >> x;
update(x, -1);
if(mn == x)
{
mn = inf;
}
else if(mx == x)
{
mx = 0;
}
}
else
{
cin >> x;
int pre = pe(x) + 1;
int nxt = nt(x);
int a = abs(pre - x);
if(pre == -1)
{
a = inf / 2;
}
int b = abs(nxt - x);
if(nxt == inf)
{
b = inf / 2;
}
printf("%.2f\n",
min(
max(
a + (pre - mn - a) / 2.0,
a + (mx - x - a) / 2.0
),
max(
b + (mx - nxt - b) / 2.0,
b + (x - mn - b) / 2.0
)
)
);
}
}
}