using System;
using System.Collections.Generic;
using System.Linq;
namespace ClosestStars
{
class Star : IComparable<Star>
{
public readonly long X;
public readonly long Y;
public readonly long Z;
public readonly long DISTANCE;
public Star(int x, int y, int z)
{
X = (long)x;
Y = (long)y;
Z = (long)z;
DISTANCE = X * X + Y * Y + Z * Z;
}
public double Distance(Star other)
{
long dx = X - other.X;
long dy = Y - other.Y;
long dz = Z - other.Z;
return Math.Sqrt(dx * dx + dy * dy + dz * dz);
}
public override string ToString()
{
return String.Format("{0} {1} {2}", X, Y, Z);
}
public int CompareTo(Star other)
{
return DISTANCE < other.DISTANCE ? -1 :
Convert.ToInt32(DISTANCE != other.DISTANCE);
}
}
class StarPair : IComparable<StarPair>
{
public readonly Star STAR_1;
public readonly Star STAR_2;
private readonly double DISTANCE;
public StarPair(Star star1, Star star2)
{
STAR_1 = star1;
STAR_2 = star2;
DISTANCE = STAR_1.Distance(STAR_2);
}
public override string ToString()
{
return String.Format(
"Star1: {0}\nStar2: {1}\nDistance: {2}",
STAR_1, STAR_2, DISTANCE);
}
public int CompareTo(StarPair other)
{
return DISTANCE < other.DISTANCE ? -1 : 1;
}
}
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();
Star[] stars = new Star[1000000];
int i;
for (i = 0; i < 1000000; i++)
{
stars[i] = new Star(
rnd.Next(1, 1000000),
rnd.Next(1, 1000000),
rnd.Next(1, 1000000));
}
Array.Sort(stars);
StarPair[] pairs = new StarPair[999999];
for (i = 0; i < 999999; i++)
{
pairs[i] = new StarPair(stars[i], stars[i + 1]);
}
Console.WriteLine(pairs.Min());
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpuYW1lc3BhY2UgQ2xvc2VzdFN0YXJzCnsKICAgIGNsYXNzIFN0YXIgOiBJQ29tcGFyYWJsZTxTdGFyPgogICAgewogICAgICAgIHB1YmxpYyByZWFkb25seSBsb25nIFg7CiAgICAgICAgcHVibGljIHJlYWRvbmx5IGxvbmcgWTsKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbG9uZyBaOwogICAgICAgIHB1YmxpYyByZWFkb25seSBsb25nIERJU1RBTkNFOwoKICAgICAgICBwdWJsaWMgU3RhcihpbnQgeCwgaW50IHksIGludCB6KQogICAgICAgIHsKICAgICAgICAgICAgWCA9IChsb25nKXg7CiAgICAgICAgICAgIFkgPSAobG9uZyl5OwogICAgICAgICAgICBaID0gKGxvbmcpejsKICAgICAgICAgICAgRElTVEFOQ0UgPSBYICogWCArIFkgKiBZICsgWiAqIFo7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgZG91YmxlIERpc3RhbmNlKFN0YXIgb3RoZXIpCiAgICAgICAgewogICAgICAgICAgICBsb25nIGR4ID0gWCAtIG90aGVyLlg7CiAgICAgICAgICAgIGxvbmcgZHkgPSBZIC0gb3RoZXIuWTsKICAgICAgICAgICAgbG9uZyBkeiA9IFogLSBvdGhlci5aOwogICAgICAgICAgICByZXR1cm4gTWF0aC5TcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJ7MH0gezF9IHsyfSIsIFgsIFksIFopOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBDb21wYXJlVG8oU3RhciBvdGhlcikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBESVNUQU5DRSA8IG90aGVyLkRJU1RBTkNFID8gLTEgOgogICAgICAgICAgICAgICAgQ29udmVydC5Ub0ludDMyKERJU1RBTkNFICE9IG90aGVyLkRJU1RBTkNFKTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgU3RhclBhaXIgOiBJQ29tcGFyYWJsZTxTdGFyUGFpcj4KICAgIHsKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgU3RhciBTVEFSXzE7CiAgICAgICAgcHVibGljIHJlYWRvbmx5IFN0YXIgU1RBUl8yOwogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZG91YmxlIERJU1RBTkNFOwoKICAgICAgICBwdWJsaWMgU3RhclBhaXIoU3RhciBzdGFyMSwgU3RhciBzdGFyMikKICAgICAgICB7CiAgICAgICAgICAgIFNUQVJfMSA9IHN0YXIxOwogICAgICAgICAgICBTVEFSXzIgPSBzdGFyMjsKICAgICAgICAgICAgRElTVEFOQ0UgPSBTVEFSXzEuRGlzdGFuY2UoU1RBUl8yKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoCiAgICAgICAgICAgICAgICAiU3RhcjE6IHswfVxuU3RhcjI6IHsxfVxuRGlzdGFuY2U6IHsyfSIsCiAgICAgICAgICAgICAgICBTVEFSXzEsIFNUQVJfMiwgRElTVEFOQ0UpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBDb21wYXJlVG8oU3RhclBhaXIgb3RoZXIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gRElTVEFOQ0UgPCBvdGhlci5ESVNUQU5DRSA/IC0xIDogMTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUHJvZ3JhbQogICAgewogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgICAgIFN0YXJbXSBzdGFycyA9IG5ldyBTdGFyWzEwMDAwMDBdOwogICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnNbaV0gPSBuZXcgU3RhcigKICAgICAgICAgICAgICAgICAgICBybmQuTmV4dCgxLCAxMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICBybmQuTmV4dCgxLCAxMDAwMDAwKSwKICAgICAgICAgICAgICAgICAgICBybmQuTmV4dCgxLCAxMDAwMDAwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQXJyYXkuU29ydChzdGFycyk7CiAgICAgICAgICAgIFN0YXJQYWlyW10gcGFpcnMgPSBuZXcgU3RhclBhaXJbOTk5OTk5XTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDk5OTk5OTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYWlyc1tpXSA9IG5ldyBTdGFyUGFpcihzdGFyc1tpXSwgc3RhcnNbaSArIDFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShwYWlycy5NaW4oKSk7CiAgICAgICAgfQogICAgfQp9