Почему при вызове теста, программа делает сплит по подстрокам не до конца. Вот тест:
50 957606811
708581757 611352966 27081775 262956438 933522126 97980711 328933520 360763165 252642449 721982861 648302665 926560784 322418430 735617857 693721620 839351069 285338448 328363087 744285088 226872983 86053701 35344255 495071776 634658060 134806398 488346118 640178535 403494264 725067038 310809688 674047243 942082092 68779516 531607770 699768886 698855882 12322436 131197359 183891465 292725869 728294699 358663599 116890796 335750885 621604236 716633206 648062198 914695460 529684376 345849014
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Pobednyaa
{
class Program
{
static void Main(string[] args)
{
int per1 = 0, per2 = 0;
int flag = 0;
int m2first = -1, m2last = -1;
int a1 = 0, a2 = 0;
int first = -1, last = -1;
string[] s = Console.ReadLine().Split(' ');
int n = int.Parse(s[0]);
long p = long.Parse(s[1]);
double min = 1000000000;
int mfirst = -1, mlast = -1;
int m1first = -1, m1last = -1;
double[] arr = new double[n];
string[] s2 = Console.ReadLine().Split(new char[] { ' ','\n','\t','\v' });
for (int i = 0; i < n; i++)
{
arr[i] = double.Parse(s2[i]);
}
double[] arr2 = new double[n];
int nfirst = first, nlast = last;
Array.Copy(arr, arr2, n);
Array.Sort(arr);
if (BS(arr, p) == 0)
{
first = 0;
last = 1;
flag = 1;
nfirst = first; nlast = last;
while (nlast != arr.Length)
{
if (Math.Abs((arr[nlast] / arr[nfirst]) - p) <= min)
{
min = Math.Abs((arr[nlast] / arr[nfirst]) - p);
mfirst = (int)arr[nfirst];
mlast = (int)arr[nlast];
}
if (nlast == arr.Length - 1) { break; }
nlast++;
}
while (nfirst != arr.Length - 1)
{
nlast = nfirst + 1;
while (nlast != arr.Length)
{
if (Math.Abs((arr[nlast] / arr[nfirst]) - p) <= min)
{
min = Math.Abs((arr[nlast] / arr[nfirst]) - p);
mfirst = (int)arr[nfirst];
mlast = (int)arr[nlast];
}
if (nlast == arr.Length - 1) break;
nlast++;
}
nfirst++;
}
}
else if (BS(arr, p) == arr.Length - 1)
{
flag = 2;
last = arr.Length - 1;
first = args.Length - 2;
while (first != -1)
{
if (Math.Abs((arr[last] / arr[first]) - p) <= min)
{
min = Math.Abs((arr[last] / arr[first]) - p);
m1first = (int)arr[first];
m1last = (int)arr[last];
}
if (first == 0) break;
first--;
}
while (last != 0)
{
if (Math.Abs((arr[last] / arr[first]) - p) <= min)
{
min = Math.Abs((arr[last] / arr[first]) - p);
m1first = (int)arr[first];
m1last = (int)arr[last];
}
if (last == 1)
{
break;
}
last--;
}
}
else
{
flag = 3;
per1 = BS(arr, p) - 1;
per2 = BS(arr, p) + 1;
while (per2 != arr.Length)
{
if (Math.Abs((arr[per2] / arr[per1]) - p) <= min)
{
min = Math.Abs((arr[per2] / arr[per1]) - p);
m2first = (int)arr[per1];
m2last = (int)arr[per2];
}
if (per2 == arr.Length - 1) break;
per2++;
}
}
if (flag == 1)
{
for (int i = 0; i < n; i++)
{
if (arr2[i] == mlast)
{
a1 = i;
}
if (arr2[i] == mfirst)
{
a2 = i;
}
}
a1++;
a2++;
Console.Write("{0} {1}", a1, a2);
}
else if (flag == 2)
{
for (int i = 0; i < n; i++)
{
if (arr2[i] == m1last)
{
a1 = i;
}
if (arr2[i] == m1first)
{
a2 = i;
}
}
a1++;
a2++;
Console.Write("{0} {1}", a1, a2);
}
else
{
for (int i = 0; i < n; i++)
{
if (arr2[i] == m2last)
{
a1 = i;
}
if (arr2[i] == m2first)
{
a2 = i;
}
}
a1++;
a2++;
Console.Write("{0} {1}", a1, a2);
}
}
static int BS(double[] a, long key)
{
int l = 0, r = a.Length;
int mid;
while (r - l > 1)
{
mid = (l + r) / 2;
if (a[mid] > key)
{
r = mid;
}
else
{
l = mid;
}
}
return l;
}
}
}