// миллионная переработка.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
const int MAX_N = 20;
struct Point
{
float x, y;
};
bool TryToFormSquare(const Point& p1, const Point& p2, const Point& p3, const Point& p4)
{
if (((sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)))==(sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y))))&&((sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)))==(sqrt((p4.x-p3.x)*(p4.x-p3.x)+(p4.y-p3.y)*(p4.y-p3.y))))&&((sqrt((p4.x-p3.x)*(p4.x-p3.x)+(p4.y-p3.y)*(p4.y-p3.y)))==(sqrt((p1.x-p4.x)*(p1.x-p4.x)+(p1.y-p4.y)*(p1.y-p4.y))))&&((sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y)))==(sqrt((p4.x-p2.x)*(p4.x-p2.x)+(p4.y-p2.y)*(p4.y-p2.y)))))
{return true;}
else if (((sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y)))==(sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y))))&&((sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)))==(sqrt((p4.x-p2.x)*(p4.x-p2.x)+(p4.y-p2.y)*(p4.y-p2.y))))&&((sqrt((p4.x-p2.x)*(p4.x-p2.x)+(p4.y-p2.y)*(p4.y-p2.y)))==(sqrt((p1.x-p4.x)*(p1.x-p4.x)+(p1.y-p4.y)*(p1.y-p4.y))))&&((sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)))==(sqrt((p4.x-p3.x)*(p4.x-p3.x)+(p4.y-p3.y)*(p4.y-p3.y)))))
{return true;}
else if (((sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)))==(sqrt((p4.x-p2.x)*(p4.x-p2.x)+(p4.y-p2.y)*(p4.y-p2.y))))&&((sqrt((p4.x-p2.x)*(p4.x-p2.x)+(p4.y-p2.y)*(p4.y-p2.y)))==(sqrt((p3.x-p4.x)*(p3.x-p4.x)+(p3.y-p4.y)*(p3.y-p4.y))))&&((sqrt((p3.x-p4.x)*(p3.x-p4.x)+(p3.y-p4.y)*(p3.y-p4.y)))==(sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y))))&&((sqrt((p1.x-p4.x)*(p1.x-p4.x)+(p1.y-p4.y)*(p1.y-p4.y)))==(sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)))))
{return true;}
else {return false;}
}
float HalfPerim(float a, float b, float c)
{
return ((a+b+c)/2);
}
float dest(const Point& p1, const Point& p2)
{
return (sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y)));
}
float square(const Point& p, const Point& p2, const Point& p4)
{
return sqrt(HalfPerim(dest(p, p2), dest(p, p4), dest(p2, p4))*((HalfPerim(dest(p, p2), dest(p, p4), dest(p2, p4))) - dest(p, p2))*((HalfPerim(dest(p, p2), dest(p, p4), dest(p2, p4))) - dest(p2, p4))*((HalfPerim(dest(p, p2), dest(p, p4), dest(p2, p4))) - dest(p, p4)));
}
bool IsPointInsideRect(const Point& p, const Point& p1, const Point& p2, const Point& p3, const Point& p4)
{
if (((sqrt((p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y))) == (sqrt((p3.x - p2.x)*(p3.x - p2.x) + (p3.y - p2.y)*(p3.y - p2.y)))) && ((sqrt((p3.x - p2.x)*(p3.x - p2.x) + (p3.y - p2.y)*(p3.y - p2.y))) == (sqrt((p4.x - p3.x)*(p4.x - p3.x) + (p4.y - p3.y)*(p4.y - p3.y)))) && ((sqrt((p4.x - p3.x)*(p4.x - p3.x) + (p4.y - p3.y)*(p4.y - p3.y))) == (sqrt((p1.x - p4.x)*(p1.x - p4.x) + (p1.y - p4.y)*(p1.y - p4.y)))) && ((sqrt((p1.x - p3.x)*(p1.x - p3.x) + (p1.y - p3.y)*(p1.y - p3.y))) == (sqrt((p4.x - p2.x)*(p4.x - p2.x) + (p4.y - p2.y)*(p4.y - p2.y)))))
{
if ((square(p, p2, p4)) >= (square(p, p1, p3)))
{
if ((square(p, p2, p4)) <= ((dest(p1, p2)*dest(p1, p2)) / 2))
{
return true;
}
else return false;
}
else
{
if ((square(p, p2, p4)) < (square(p, p1, p3)))
{
if ((square(p, p1, p3)) <= ((dest(p1, p2)*dest(p1, p2)) / 2))
{
return true;
}
else return false;
}
}
}
else if (((sqrt((p1.x - p3.x)*(p1.x - p3.x) + (p1.y - p3.y)*(p1.y - p3.y))) == (sqrt((p3.x - p2.x)*(p3.x - p2.x) + (p3.y - p2.y)*(p3.y - p2.y)))) && ((sqrt((p3.x - p2.x)*(p3.x - p2.x) + (p3.y - p2.y)*(p3.y - p2.y))) == (sqrt((p4.x - p2.x)*(p4.x - p2.x) + (p4.y - p2.y)*(p4.y - p2.y)))) && ((sqrt((p4.x - p2.x)*(p4.x - p2.x) + (p4.y - p2.y)*(p4.y - p2.y))) == (sqrt((p1.x - p4.x)*(p1.x - p4.x) + (p1.y - p4.y)*(p1.y - p4.y)))) && ((sqrt((p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y))) == (sqrt((p4.x - p3.x)*(p4.x - p3.x) + (p4.y - p3.y)*(p4.y - p3.y)))))
{
{
if ((square(p, p1, p2)) >= (square(p, p3, p4)))
{
if ((square(p, p1, p2)) <= ((dest(p1, p3)*dest(p1, p3)) / 2))
{
return true;
}
else return false;
}
else
{
if ((square(p, p1, p2)) < (square(p, p3, p4)))
{
if ((square(p, p1, p2)) <= ((dest(p1, p3)*dest(p1, p3)) / 2))
{
return true;
}
else return false;
}
}
}
}
else if (((sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y))) == (sqrt((p4.x - p2.x)*(p4.x - p2.x) + (p4.y - p2.y)*(p4.y - p2.y)))) && ((sqrt((p4.x - p2.x)*(p4.x - p2.x) + (p4.y - p2.y)*(p4.y - p2.y))) == (sqrt((p3.x - p4.x)*(p3.x - p4.x) + (p3.y - p4.y)*(p3.y - p4.y)))) && ((sqrt((p3.x - p4.x)*(p3.x - p4.x) + (p3.y - p4.y)*(p3.y - p4.y))) == (sqrt((p1.x - p3.x)*(p1.x - p3.x) + (p1.y - p3.y)*(p1.y - p3.y)))) && ((sqrt((p1.x - p4.x)*(p1.x - p4.x) + (p1.y - p4.y)*(p1.y - p4.y))) == (sqrt((p3.x - p2.x)*(p3.x - p2.x) + (p3.y - p2.y)*(p3.y - p2.y)))))
{
{
if ((square(p, p2, p3)) >= (square(p, p1, p4)))
{
if ((square(p, p2, p3)) <= ((dest(p1, p2)*dest(p1, p2)) / 2))
{
return true;
}
else return false;
}
else
{
if ((square(p, p2, p3)) < (square(p, p1, p4)))
{
if ((square(p, p2, p3)) <= ((dest(p1, p2)*dest(p1, p2)) / 2))
{
return true;
}
else return false;
}
}
}
}
else { return false; }
}
int main()
{
// Point points[MAX_N];
int N = 0;
cout<<"input point\n";
cin>>N;
Point *points=new Point[N];
cout<<"Please, enter N points:\n";
for(int i=0;i<N;i++)
{cin>>points[i].x>>points[i].y;}
int maxPointsInRect = -1;
float maxPoint1x = 0;
float maxPoint1y = 0;
float maxPoint2x = 0;
float maxPoint2y = 0;
float maxPoint3x = 0;
float maxPoint3y = 0;
float maxPoint4x = 0;
float maxPoint4y = 0;
for (int i1 = 0; i1 < N-3; ++i1)
for (int i2 = i1+1; i2 < N-2; ++i2)
for (int i3 = i2+1; i3 < N-1; ++i3)
for (int i4 = i3+1; i4 < N; ++i4)
if (TryToFormSquare(points[i1], points[i2], points[i3], points[i4]))
{
cout << "Found rectange with points. Coordinates of points: " << points[i1].x <<" "<<points[i1].y << ", "<< points[i2].x <<" "<<points[i2].y << ", " << points[i3].x <<" "<<points[i3].y << ", " << points[i4].x <<" "<<points[i4].y << ", " << endl;
int pointsInRect = 0;
for (int j = 0; j < N; ++j)
if (j != i1 && j != i2 && j != i3 && j != i4)
if (IsPointInsideRect(points[j], points[i1], points[i2], points[i3], points[i4]))
++pointsInRect;
if (pointsInRect > maxPointsInRect)
{
maxPointsInRect = pointsInRect;
maxPoint1x = points[i1].x;
maxPoint1y = points[i1].y;
maxPoint2x = points[i2].x;
maxPoint2y = points[i2].y;
maxPoint3x = points[i3].x;
maxPoint3y = points[i3].y;
maxPoint4x = points[i4].x;
maxPoint4y = points[i4].y;
}
}
if ((maxPointsInRect == -1) || (maxPointsInRect == 0))
{
cout << "No rectangles are found" << endl;
}
else
{
cout << "Maximus points number inside a rectagle is " << maxPointsInRect << ". Rectange is build from points with coordinates " << maxPoint1x << " " << maxPoint1y << ", " << maxPoint2x << " " << maxPoint2y << ", " << maxPoint3x << " " << maxPoint3y << ", " << maxPoint4x << " "<< maxPoint4y << endl;
}
delete[] points;
return 0;
}
Ly8g0LzQuNC70LvQuNC+0L3QvdCw0Y8g0L/QtdGA0LXRgNCw0LHQvtGC0LrQsC5jcHA6INC+0L/RgNC10LTQtdC70Y/QtdGCINGC0L7Rh9C60YMg0LLRhdC+0LTQsCDQtNC70Y8g0LrQvtC90YHQvtC70YzQvdC+0LPQviDQv9GA0LjQu9C+0LbQtdC90LjRjy4KLy8KCiNpbmNsdWRlICJzdGRhZnguaCIKI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgTUFYX04gPSAyMDsKCnN0cnVjdCBQb2ludAp7CiAgIGZsb2F0IHgsIHk7Cn07CgoKYm9vbCBUcnlUb0Zvcm1TcXVhcmUoY29uc3QgUG9pbnQmIHAxLCBjb25zdCBQb2ludCYgcDIsIGNvbnN0IFBvaW50JiBwMywgY29uc3QgUG9pbnQmIHA0KQp7CiAgIGlmICgoKHNxcnQoKHAyLngtcDEueCkqKHAyLngtcDEueCkrKHAyLnktcDEueSkqKHAyLnktcDEueSkpKT09KHNxcnQoKHAzLngtcDIueCkqKHAzLngtcDIueCkrKHAzLnktcDIueSkqKHAzLnktcDIueSkpKSkmJigoc3FydCgocDMueC1wMi54KSoocDMueC1wMi54KSsocDMueS1wMi55KSoocDMueS1wMi55KSkpPT0oc3FydCgocDQueC1wMy54KSoocDQueC1wMy54KSsocDQueS1wMy55KSoocDQueS1wMy55KSkpKSYmKChzcXJ0KChwNC54LXAzLngpKihwNC54LXAzLngpKyhwNC55LXAzLnkpKihwNC55LXAzLnkpKSk9PShzcXJ0KChwMS54LXA0LngpKihwMS54LXA0LngpKyhwMS55LXA0LnkpKihwMS55LXA0LnkpKSkpJiYoKHNxcnQoKHAxLngtcDMueCkqKHAxLngtcDMueCkrKHAxLnktcDMueSkqKHAxLnktcDMueSkpKT09KHNxcnQoKHA0LngtcDIueCkqKHA0LngtcDIueCkrKHA0LnktcDIueSkqKHA0LnktcDIueSkpKSkpCiAgIHtyZXR1cm4gdHJ1ZTt9CiAgIGVsc2UgaWYgKCgoc3FydCgocDEueC1wMy54KSoocDEueC1wMy54KSsocDEueS1wMy55KSoocDEueS1wMy55KSkpPT0oc3FydCgocDMueC1wMi54KSoocDMueC1wMi54KSsocDMueS1wMi55KSoocDMueS1wMi55KSkpKSYmKChzcXJ0KChwMy54LXAyLngpKihwMy54LXAyLngpKyhwMy55LXAyLnkpKihwMy55LXAyLnkpKSk9PShzcXJ0KChwNC54LXAyLngpKihwNC54LXAyLngpKyhwNC55LXAyLnkpKihwNC55LXAyLnkpKSkpJiYoKHNxcnQoKHA0LngtcDIueCkqKHA0LngtcDIueCkrKHA0LnktcDIueSkqKHA0LnktcDIueSkpKT09KHNxcnQoKHAxLngtcDQueCkqKHAxLngtcDQueCkrKHAxLnktcDQueSkqKHAxLnktcDQueSkpKSkmJigoc3FydCgocDIueC1wMS54KSoocDIueC1wMS54KSsocDIueS1wMS55KSoocDIueS1wMS55KSkpPT0oc3FydCgocDQueC1wMy54KSoocDQueC1wMy54KSsocDQueS1wMy55KSoocDQueS1wMy55KSkpKSkKICAge3JldHVybiB0cnVlO30KICAgZWxzZSBpZiAoKChzcXJ0KChwMS54LXAyLngpKihwMS54LXAyLngpKyhwMS55LXAyLnkpKihwMS55LXAyLnkpKSk9PShzcXJ0KChwNC54LXAyLngpKihwNC54LXAyLngpKyhwNC55LXAyLnkpKihwNC55LXAyLnkpKSkpJiYoKHNxcnQoKHA0LngtcDIueCkqKHA0LngtcDIueCkrKHA0LnktcDIueSkqKHA0LnktcDIueSkpKT09KHNxcnQoKHAzLngtcDQueCkqKHAzLngtcDQueCkrKHAzLnktcDQueSkqKHAzLnktcDQueSkpKSkmJigoc3FydCgocDMueC1wNC54KSoocDMueC1wNC54KSsocDMueS1wNC55KSoocDMueS1wNC55KSkpPT0oc3FydCgocDEueC1wMy54KSoocDEueC1wMy54KSsocDEueS1wMy55KSoocDEueS1wMy55KSkpKSYmKChzcXJ0KChwMS54LXA0LngpKihwMS54LXA0LngpKyhwMS55LXA0LnkpKihwMS55LXA0LnkpKSk9PShzcXJ0KChwMy54LXAyLngpKihwMy54LXAyLngpKyhwMy55LXAyLnkpKihwMy55LXAyLnkpKSkpKQogICB7cmV0dXJuIHRydWU7fQogICBlbHNlIHtyZXR1cm4gZmFsc2U7fQp9CmZsb2F0IEhhbGZQZXJpbShmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQp7CglyZXR1cm4gKChhK2IrYykvMik7Cn0KZmxvYXQgZGVzdChjb25zdCBQb2ludCYgcDEsIGNvbnN0IFBvaW50JiBwMikKewoJcmV0dXJuIChzcXJ0KChwMS54IC0gcDIueCkqKHAxLnggLSBwMi54KSArIChwMS55IC0gcDIueSkqKHAxLnkgLSBwMi55KSkpOwoKCn0KZmxvYXQgc3F1YXJlKGNvbnN0IFBvaW50JiBwLCBjb25zdCBQb2ludCYgcDIsIGNvbnN0IFBvaW50JiBwNCkKCXsKCXJldHVybiBzcXJ0KEhhbGZQZXJpbShkZXN0KHAsIHAyKSwgZGVzdChwLCBwNCksIGRlc3QocDIsIHA0KSkqKChIYWxmUGVyaW0oZGVzdChwLCBwMiksIGRlc3QocCwgcDQpLCBkZXN0KHAyLCBwNCkpKSAtIGRlc3QocCwgcDIpKSooKEhhbGZQZXJpbShkZXN0KHAsIHAyKSwgZGVzdChwLCBwNCksIGRlc3QocDIsIHA0KSkpIC0gZGVzdChwMiwgcDQpKSooKEhhbGZQZXJpbShkZXN0KHAsIHAyKSwgZGVzdChwLCBwNCksIGRlc3QocDIsIHA0KSkpIC0gZGVzdChwLCBwNCkpKTsKCgkJCgl9CgoJCmJvb2wgSXNQb2ludEluc2lkZVJlY3QoY29uc3QgUG9pbnQmIHAsIGNvbnN0IFBvaW50JiBwMSwgY29uc3QgUG9pbnQmIHAyLCBjb25zdCBQb2ludCYgcDMsIGNvbnN0IFBvaW50JiBwNCkKewoJCglpZiAoKChzcXJ0KChwMi54IC0gcDEueCkqKHAyLnggLSBwMS54KSArIChwMi55IC0gcDEueSkqKHAyLnkgLSBwMS55KSkpID09IChzcXJ0KChwMy54IC0gcDIueCkqKHAzLnggLSBwMi54KSArIChwMy55IC0gcDIueSkqKHAzLnkgLSBwMi55KSkpKSAmJiAoKHNxcnQoKHAzLnggLSBwMi54KSoocDMueCAtIHAyLngpICsgKHAzLnkgLSBwMi55KSoocDMueSAtIHAyLnkpKSkgPT0gKHNxcnQoKHA0LnggLSBwMy54KSoocDQueCAtIHAzLngpICsgKHA0LnkgLSBwMy55KSoocDQueSAtIHAzLnkpKSkpICYmICgoc3FydCgocDQueCAtIHAzLngpKihwNC54IC0gcDMueCkgKyAocDQueSAtIHAzLnkpKihwNC55IC0gcDMueSkpKSA9PSAoc3FydCgocDEueCAtIHA0LngpKihwMS54IC0gcDQueCkgKyAocDEueSAtIHA0LnkpKihwMS55IC0gcDQueSkpKSkgJiYgKChzcXJ0KChwMS54IC0gcDMueCkqKHAxLnggLSBwMy54KSArIChwMS55IC0gcDMueSkqKHAxLnkgLSBwMy55KSkpID09IChzcXJ0KChwNC54IC0gcDIueCkqKHA0LnggLSBwMi54KSArIChwNC55IC0gcDIueSkqKHA0LnkgLSBwMi55KSkpKSkKCXsKCQlpZiAoKHNxdWFyZShwLCBwMiwgcDQpKSA+PSAoc3F1YXJlKHAsIHAxLCBwMykpKQoJCXsKCQkJaWYgKChzcXVhcmUocCwgcDIsIHA0KSkgPD0gKChkZXN0KHAxLCBwMikqZGVzdChwMSwgcDIpKSAvIDIpKQoJCQl7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQllbHNlIHJldHVybiBmYWxzZTsKCgkJfQoJCWVsc2UKCQl7CgkJCWlmICgoc3F1YXJlKHAsIHAyLCBwNCkpIDwgKHNxdWFyZShwLCBwMSwgcDMpKSkKCQkJewoJCQkJaWYgKChzcXVhcmUocCwgcDEsIHAzKSkgPD0gKChkZXN0KHAxLCBwMikqZGVzdChwMSwgcDIpKSAvIDIpKQoJCQkJewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQkJZWxzZSByZXR1cm4gZmFsc2U7CgkJCX0KCgkJfQoJfQoJZWxzZSBpZiAoKChzcXJ0KChwMS54IC0gcDMueCkqKHAxLnggLSBwMy54KSArIChwMS55IC0gcDMueSkqKHAxLnkgLSBwMy55KSkpID09IChzcXJ0KChwMy54IC0gcDIueCkqKHAzLnggLSBwMi54KSArIChwMy55IC0gcDIueSkqKHAzLnkgLSBwMi55KSkpKSAmJiAoKHNxcnQoKHAzLnggLSBwMi54KSoocDMueCAtIHAyLngpICsgKHAzLnkgLSBwMi55KSoocDMueSAtIHAyLnkpKSkgPT0gKHNxcnQoKHA0LnggLSBwMi54KSoocDQueCAtIHAyLngpICsgKHA0LnkgLSBwMi55KSoocDQueSAtIHAyLnkpKSkpICYmICgoc3FydCgocDQueCAtIHAyLngpKihwNC54IC0gcDIueCkgKyAocDQueSAtIHAyLnkpKihwNC55IC0gcDIueSkpKSA9PSAoc3FydCgocDEueCAtIHA0LngpKihwMS54IC0gcDQueCkgKyAocDEueSAtIHA0LnkpKihwMS55IC0gcDQueSkpKSkgJiYgKChzcXJ0KChwMi54IC0gcDEueCkqKHAyLnggLSBwMS54KSArIChwMi55IC0gcDEueSkqKHAyLnkgLSBwMS55KSkpID09IChzcXJ0KChwNC54IC0gcDMueCkqKHA0LnggLSBwMy54KSArIChwNC55IC0gcDMueSkqKHA0LnkgLSBwMy55KSkpKSkKCXsKCQl7CgkJCWlmICgoc3F1YXJlKHAsIHAxLCBwMikpID49IChzcXVhcmUocCwgcDMsIHA0KSkpCgkJCXsKCQkJCWlmICgoc3F1YXJlKHAsIHAxLCBwMikpIDw9ICgoZGVzdChwMSwgcDMpKmRlc3QocDEsIHAzKSkgLyAyKSkKCQkJCXsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJCWVsc2UgcmV0dXJuIGZhbHNlOwoKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmICgoc3F1YXJlKHAsIHAxLCBwMikpIDwgKHNxdWFyZShwLCBwMywgcDQpKSkKCQkJCXsKCQkJCQlpZiAoKHNxdWFyZShwLCBwMSwgcDIpKSA8PSAoKGRlc3QocDEsIHAzKSpkZXN0KHAxLCBwMykpIC8gMikpCgkJCQkJewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJZWxzZSByZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9CgkJfQoJfQoJZWxzZSBpZiAoKChzcXJ0KChwMS54IC0gcDIueCkqKHAxLnggLSBwMi54KSArIChwMS55IC0gcDIueSkqKHAxLnkgLSBwMi55KSkpID09IChzcXJ0KChwNC54IC0gcDIueCkqKHA0LnggLSBwMi54KSArIChwNC55IC0gcDIueSkqKHA0LnkgLSBwMi55KSkpKSAmJiAoKHNxcnQoKHA0LnggLSBwMi54KSoocDQueCAtIHAyLngpICsgKHA0LnkgLSBwMi55KSoocDQueSAtIHAyLnkpKSkgPT0gKHNxcnQoKHAzLnggLSBwNC54KSoocDMueCAtIHA0LngpICsgKHAzLnkgLSBwNC55KSoocDMueSAtIHA0LnkpKSkpICYmICgoc3FydCgocDMueCAtIHA0LngpKihwMy54IC0gcDQueCkgKyAocDMueSAtIHA0LnkpKihwMy55IC0gcDQueSkpKSA9PSAoc3FydCgocDEueCAtIHAzLngpKihwMS54IC0gcDMueCkgKyAocDEueSAtIHAzLnkpKihwMS55IC0gcDMueSkpKSkgJiYgKChzcXJ0KChwMS54IC0gcDQueCkqKHAxLnggLSBwNC54KSArIChwMS55IC0gcDQueSkqKHAxLnkgLSBwNC55KSkpID09IChzcXJ0KChwMy54IC0gcDIueCkqKHAzLnggLSBwMi54KSArIChwMy55IC0gcDIueSkqKHAzLnkgLSBwMi55KSkpKSkKCXsKCQl7CgkJCWlmICgoc3F1YXJlKHAsIHAyLCBwMykpID49IChzcXVhcmUocCwgcDEsIHA0KSkpCgkJCXsKCQkJCWlmICgoc3F1YXJlKHAsIHAyLCBwMykpIDw9ICgoZGVzdChwMSwgcDIpKmRlc3QocDEsIHAyKSkgLyAyKSkKCQkJCXsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJCWVsc2UgcmV0dXJuIGZhbHNlOwoKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmICgoc3F1YXJlKHAsIHAyLCBwMykpIDwgKHNxdWFyZShwLCBwMSwgcDQpKSkKCQkJCXsKCQkJCQlpZiAoKHNxdWFyZShwLCBwMiwgcDMpKSA8PSAoKGRlc3QocDEsIHAyKSpkZXN0KHAxLCBwMikpIC8gMikpCgkJCQkJewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJZWxzZSByZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9CgkJfQoJfQoJZWxzZSB7IHJldHVybiBmYWxzZTsgfQp9CgppbnQgbWFpbigpCnsKIC8vICBQb2ludCBwb2ludHNbTUFYX05dOwoKICAgaW50IE4gPSAwOwogICBjb3V0PDwiaW5wdXQgcG9pbnRcbiI7CiAgICBjaW4+Pk47CiAgICBQb2ludCAqcG9pbnRzPW5ldyBQb2ludFtOXTsKICAgIGNvdXQ8PCJQbGVhc2UsIGVudGVyIE4gcG9pbnRzOlxuIjsKICAgIGZvcihpbnQgaT0wO2k8TjtpKyspCiAgICB7Y2luPj5wb2ludHNbaV0ueD4+cG9pbnRzW2ldLnk7fQoKICAgaW50IG1heFBvaW50c0luUmVjdCA9IC0xOwogICBmbG9hdCBtYXhQb2ludDF4ID0gMDsKICAgZmxvYXQgbWF4UG9pbnQxeSA9IDA7CiAgIGZsb2F0IG1heFBvaW50MnggPSAwOwogICBmbG9hdCBtYXhQb2ludDJ5ID0gMDsKICAgZmxvYXQgbWF4UG9pbnQzeCA9IDA7CiAgIGZsb2F0IG1heFBvaW50M3kgPSAwOwogICBmbG9hdCBtYXhQb2ludDR4ID0gMDsKICAgZmxvYXQgbWF4UG9pbnQ0eSA9IDA7CgoKICAgZm9yIChpbnQgaTEgPSAwOyBpMSA8IE4tMzsgKytpMSkKICAgICAgZm9yIChpbnQgaTIgPSBpMSsxOyBpMiA8IE4tMjsgKytpMikKICAgICAgICAgIGZvciAoaW50IGkzID0gaTIrMTsgaTMgPCBOLTE7ICsraTMpCiAgICAgICAgICAgICBmb3IgKGludCBpNCA9IGkzKzE7IGk0IDwgTjsgKytpNCkKICAgICAgICAgICAgICAgaWYgKFRyeVRvRm9ybVNxdWFyZShwb2ludHNbaTFdLCBwb2ludHNbaTJdLCBwb2ludHNbaTNdLCBwb2ludHNbaTRdKSkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBjb3V0IDw8ICJGb3VuZCByZWN0YW5nZSB3aXRoIHBvaW50cy4gQ29vcmRpbmF0ZXMgb2YgcG9pbnRzOiAiIDw8IHBvaW50c1tpMV0ueCA8PCIgIjw8cG9pbnRzW2kxXS55IDw8ICIsICI8PCBwb2ludHNbaTJdLnggPDwiICI8PHBvaW50c1tpMl0ueSA8PCAiLCAiIDw8IHBvaW50c1tpM10ueCA8PCIgIjw8cG9pbnRzW2kzXS55IDw8ICIsICIgPDwgcG9pbnRzW2k0XS54IDw8IiAiPDxwb2ludHNbaTRdLnkgPDwgIiwgIiA8PCBlbmRsOwoKICAgICAgICAgICAgICAgICAgaW50IHBvaW50c0luUmVjdCA9IDA7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikKICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gaTEgJiYgaiAhPSBpMiAmJiBqICE9IGkzICYmIGogIT0gaTQpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1BvaW50SW5zaWRlUmVjdChwb2ludHNbal0sIHBvaW50c1tpMV0sIHBvaW50c1tpMl0sIHBvaW50c1tpM10sIHBvaW50c1tpNF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICArK3BvaW50c0luUmVjdDsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGlmIChwb2ludHNJblJlY3QgPiBtYXhQb2ludHNJblJlY3QpCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnRzSW5SZWN0ID0gcG9pbnRzSW5SZWN0OwoJCQkJCSBtYXhQb2ludDF4ID0gcG9pbnRzW2kxXS54OwoJCQkJCSBtYXhQb2ludDF5ID0gcG9pbnRzW2kxXS55OwoJCQkJCSBtYXhQb2ludDJ4ID0gcG9pbnRzW2kyXS54OwoJCQkJCSBtYXhQb2ludDJ5ID0gcG9pbnRzW2kyXS55OwoJCQkJCSBtYXhQb2ludDN4ID0gcG9pbnRzW2kzXS54OwoJCQkJCSBtYXhQb2ludDN5ID0gcG9pbnRzW2kzXS55OwoJCQkJCSBtYXhQb2ludDR4ID0gcG9pbnRzW2k0XS54OwoJCQkJCSBtYXhQb2ludDR5ID0gcG9pbnRzW2k0XS55OwogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICB9CgoJCQkgICBpZiAoKG1heFBvaW50c0luUmVjdCA9PSAtMSkgfHwgKG1heFBvaW50c0luUmVjdCA9PSAwKSkKICAgewogICAgIGNvdXQgPDwgIk5vIHJlY3RhbmdsZXMgYXJlIGZvdW5kIiA8PCBlbmRsOwogICB9CiAgIGVsc2UKICAgewoJICAgY291dCA8PCAiTWF4aW11cyBwb2ludHMgbnVtYmVyIGluc2lkZSBhIHJlY3RhZ2xlIGlzICIgPDwgbWF4UG9pbnRzSW5SZWN0IDw8ICIuIFJlY3RhbmdlIGlzIGJ1aWxkIGZyb20gcG9pbnRzIHdpdGggY29vcmRpbmF0ZXMgIiA8PCBtYXhQb2ludDF4IDw8ICIgIiA8PCBtYXhQb2ludDF5IDw8ICIsICIgPDwgbWF4UG9pbnQyeCA8PCAiICIgPDwgbWF4UG9pbnQyeSA8PCAiLCAiIDw8IG1heFBvaW50M3ggPDwgIiAiIDw8IG1heFBvaW50M3kgPDwgIiwgIiA8PCBtYXhQb2ludDR4IDw8ICIgIjw8IG1heFBvaW50NHkgPDwgZW5kbDsKICAgfQoJCQkgCgkJCSAgIGRlbGV0ZVtdIHBvaW50czsKCQkJICAgCnJldHVybiAwOwp9Cgo=