public int AddIfNotExist()

in csharp/src/Containers/SortedSqrtDecomposition.cs [144:237]


		public int AddIfNotExist(Type x)
		{
			bool insert = false;
			if (needRebuild)
			{
				RebuildSqrt();
			}
			for (int j = 0; j < numberOfBlocks; ++j)
			{
				if (size != 0 && dataInBegin[j] != null && comparator.Compare(dataInBegin[j], x) > 0)
				{
					if (j == 0)
					{
						for (int k = endOfBlock[0]; k > 0; k--)
						{
							data[k] = data[k - 1];
						}
						data[0] = x;
						dataInBegin[0] = x;
						endOfBlock[0]++;
						insert = true;
						size++;
						if (endOfBlock[0] == (len << 1))
						{
							needRebuild = true;
						}
						return 0;
					}
					for (int k = (len * (j - 1) << 1); k < endOfBlock[j - 1]; k++)
						if (comparator.Compare(data[k], x) > 0)
						{
							for (int l = endOfBlock[j - 1]; l > k; l--)
							{
								data[l] = data[l - 1];
							}
							data[k] = x;
							endOfBlock[j - 1]++;
							insert = true;
							size++;
							if (endOfBlock[j - 1] == (len * j << 1)) needRebuild = true;
							return k;
						}
						else if (comparator.Compare(data[k], x) == 0)
						{
							return -(k + 1);
						}
					if (!insert)
					{
						data[endOfBlock[j - 1]] = x;
						insert = true;
						endOfBlock[j - 1]++;
						size++;
						if (endOfBlock[j - 1] == (len * j << 1))
						{
							needRebuild = true;
						}
						return endOfBlock[j - 1] - 1;
					}
				}
			}
			if (!insert)
			{
				for (int j = (len * (numberOfBlocks - 1) << 1); j < endOfBlock[numberOfBlocks - 1]; ++j)
					if (data[j] != null && comparator.Compare(data[j], x) > 0)
					{
						for (int l = endOfBlock[numberOfBlocks - 1]; l > j; l--)
						{
							data[l] = data[l - 1];
						}
						data[j] = x;
						if (j == ((len * (numberOfBlocks - 1)) << 1)) dataInBegin[numberOfBlocks - 1] = x;
						insert = true;
						endOfBlock[numberOfBlocks - 1]++;
						size++;
						if (endOfBlock[numberOfBlocks - 1] == (len * numberOfBlocks << 1)) needRebuild = true;
						return j;
					}
					else if (comparator.Compare(data[j], x) == 0)
					{
						return -(j + 1);
					}
				if (!insert)
				{
					size++;
					if (endOfBlock[numberOfBlocks - 1] == (len * (numberOfBlocks - 1) << 1))
						dataInBegin[numberOfBlocks - 1] = x;
					data[endOfBlock[numberOfBlocks - 1]] = x;
					endOfBlock[numberOfBlocks - 1]++;
					if (endOfBlock[numberOfBlocks - 1] == (len * numberOfBlocks << 1)) needRebuild = true;
					return endOfBlock[numberOfBlocks - 1] - 1;
				}
			}
			return NoElement;
		}