/// <summary>
        /// The Next.
        /// </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="int"/>.</returns>
        public override int Next(int offsetBase, int offsetFactor, int indexOffset, int x)
        {
            if (min != NULL_KEY && x < min)
            {
                return(min);
            }

            BaseSpectrum scopesItem;
            int          x_highest = highest(x);
            int          scopesKey;

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

            int maximumLow = NULL_KEY;

            if (scopes.TryGet(scopesKey, out scopesItem))
            {
                maximumLow = scopesItem.IndexMax;
            }

            if (maximumLow != NULL_KEY && lowest(x) < maximumLow)
            {
                int _offset = scopesItem.Next(offsetBase + (offsetFactor * parentSqrt), (offsetFactor * parentSqrt), (indexOffset * parentSqrt) + x_highest, lowest(x));

                return(index(x_highest, _offset));
            }

            if (sigmaNode == null)
            {
                return(NULL_KEY);
            }

            //======================//
            //from sigmaNode part
            //======================//
            int successorCluster = sigmaNode.Next(x_highest);

            if (successorCluster == NULL_KEY)
            {
                return(NULL_KEY);
            }

            scopesKey = offsetBase + (indexOffset * parentSqrt) + successorCluster;

            scopes.TryGet(scopesKey, out scopesItem);
            int offset = scopesItem.IndexMin;

            return(index(successorCluster, offset));
        }