Problem : Airports
//------------------------------------------------------------------------------
// Airports C#
//------------------------------------------------------------------------------
FIO fio = new FIO();
int Q = fio.ReadInt();
for (int q = 0; q < Q; q++)
{
int N = fio.ReadInt();
int D = fio.ReadInt();
int[] X = fio.ReadIntArr(N);
int[] C = new int[N];
RedBlackTree<int> in_ports = new RedBlackTree<int>(Comparer<int>.Default);
RedBlackTree<int> in_gaps = new RedBlackTree<int>(Comparer<int>.Default);
int li = 0;
int ri = 1;
if (X[1] < X[0]) { li = 1; ri = 0; }
C[1] = Math.Max(0, D - (X[ri] - X[li]));
int item;
for (int ix = 2; ix < N; ix++)
{
int xmin_in_ports = in_ports.ElementCount > 0 &&
in_ports.FirstItemInRange(in_ports.EntireRange,
out item) != -1 ? item : 0;
int xmax_in_ports = in_ports.ElementCount > 0 &&
in_ports.LastItemInRange(in_ports.EntireRange,
out item) != -1 ? item : 0;
if (X[ix] <= X[li])
{
if (in_ports.ElementCount > 0)
in_gaps.Insert(xmin_in_ports - X[li], DuplicatePolicy.InsertLast,
out item);
in_ports.Insert(X[li], DuplicatePolicy.InsertFirst, out item);
li = ix;
}
else
if (in_ports.ElementCount > 0 && X[ix] <= xmin_in_ports)
{
in_gaps.Insert(xmin_in_ports - X[ix], DuplicatePolicy.InsertLast,
out item);
in_ports.Insert(X[ix], DuplicatePolicy.InsertFirst, out item);
}
else
if (X[ix] >= X[ri])
{
if (in_ports.ElementCount > 0)
in_gaps.Insert(X[ri] - xmax_in_ports, DuplicatePolicy.InsertLast,
out item);
in_ports.Insert(X[ri], DuplicatePolicy.InsertLast, out item);
ri = ix;
}
else
if (in_ports.ElementCount > 0 && X[ix] >= xmax_in_ports)
{
in_gaps.Insert(X[ix] - xmax_in_ports, DuplicatePolicy.InsertLast,
out item);
in_ports.Insert(X[ix], DuplicatePolicy.InsertLast, out item);
}
else
if (in_ports.ElementCount == 0)
{
in_ports.Insert(X[ix], DuplicatePolicy.InsertLast, out item);
}
else
{
in_ports.Insert(X[ix], DuplicatePolicy.InsertLast, out item);
int index = in_ports.FindIndex(X[ix], false);
int x_left = in_ports.GetItemByIndex(index - 1);
int x_right = in_ports.GetItemByIndex(index + 1);
in_gaps.Delete(x_right - x_left, false, out item);
in_gaps.Insert(X[ix] - x_left, DuplicatePolicy.InsertLast, out item);
in_gaps.Insert(x_right - X[ix], DuplicatePolicy.InsertLast, out item);
}
while (in_ports.ElementCount > 0 &&
in_ports.FirstItemInRange(in_ports.EntireRange, out item) != -1 &&
item <= X[ri] - D)
{
int deleted;
in_ports.Delete(item, true, out deleted);
if (in_ports.ElementCount > 0 &&
in_ports.FirstItemInRange(in_ports.EntireRange, out item) != -1)
in_gaps.Delete(item - deleted, false, out item);
}
while (in_ports.ElementCount > 0 &&
in_ports.LastItemInRange(in_ports.EntireRange, out item) != -1 &&
X[li] + D <= item)
{
int deleted;
in_ports.Delete(item, false, out deleted);
if (in_ports.ElementCount > 0 &&
in_ports.LastItemInRange(in_ports.EntireRange, out item) != -1)
in_gaps.Delete(deleted - item, false, out item);
}
C[ix] = Math.Max(0, D - (X[ri] - X[li]));
if (in_ports.ElementCount > 0)
{
xmin_in_ports = in_ports.FirstItemInRange(in_ports.EntireRange,
out item) != -1 ? item : 0;
xmax_in_ports = in_ports.LastItemInRange(in_ports.EntireRange,
out item) != -1 ? item : 0;
int max_gap = 0;
if (in_gaps.ElementCount == 0 ||
in_gaps.LastItemInRange(in_gaps.EntireRange, out max_gap) == -1)
max_gap = 0;
max_gap = Math.Max(max_gap, xmin_in_ports - (X[ri] - D));
max_gap = Math.Max(max_gap, (X[li] + D) - xmax_in_ports);
C[ix] = Math.Max(C[ix], (X[li] + D) - (X[ri] - D) - max_gap);
}
}
fio.WriteLine(string.Join(" ", C.Select(p => p.ToString()).ToArray()));
}
fio.Close();
//------------------------------------------------------------------------------