/// <summary>
        /// The Remove.
        /// </summary>
        /// <param name="offsetBase">The offsetBase<see cref="int"/>.</param>
        /// <param name="offsetFactor">The offsetFactor<see cref="int"/>.</param>
        /// <param name="indexOffset">The indexOffset<see cref="int"/>.</param>
        /// <param name="x">The x<see cref="int"/>.</param>
        /// <returns>The <see cref="bool"/>.</returns>
        public override bool Remove(int offsetBase, int offsetFactor, int indexOffset, int x)
        {
            if (min == max)
            {
                if (min != x)
                {
                    return(false);
                }
                min       = NULL_KEY;
                max       = NULL_KEY;
                sigmaNode = null;
                return(true);
            }

            BaseSpectrum scopesItem;
            int          x_highest;
            int          scopesKey;

            if (min == x)
            {
                int firstCluster = sigmaNode.IndexMin;

                scopesKey = offsetBase + (indexOffset * parentSqrt) + firstCluster;
                scopes.TryGet(scopesKey, out scopesItem);
                x = index(firstCluster, scopesItem.IndexMin);

                min = x;
            }

            x_highest = highest(x);
            scopesKey = offsetBase + (indexOffset * parentSqrt) + x_highest;

            if (!scopes.TryGet(scopesKey, out scopesItem))
            {
                return(false);
            }

            scopesItem.Remove(offsetBase + (offsetFactor * parentSqrt), (offsetFactor * parentSqrt), (indexOffset * parentSqrt) + x_highest, lowest(x));

            if (scopesItem.IndexMin == NULL_KEY)
            {
                scopes.Remove(scopesKey);

                sigmaNode.Remove(highest(x));

                if (x == max)
                {
                    int sigmaNodeMaximum = sigmaNode.IndexMax;

                    if (sigmaNodeMaximum == NULL_KEY)
                    {
                        max       = min;
                        sigmaNode = null;
                    }
                    else
                    {
                        scopesKey = offsetBase + (indexOffset * parentSqrt) + sigmaNodeMaximum;
                        scopes.TryGet(scopesKey, out scopesItem);

                        int maximumKey = scopesItem.IndexMax;
                        max = index(sigmaNodeMaximum, maximumKey);
                    }
                }
            }
            else if (x == max)
            {
                scopesKey = offsetBase + (indexOffset * parentSqrt) + highest(x);
                scopes.TryGet(scopesKey, out scopesItem);
                int maximumKey = scopesItem.IndexMax;

                max = index(highest(x), maximumKey);
            }
            return(true);
        }