<Problem>
https://oj.vnoi.info/problem/ballgmvn
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 2147483647
void sort(int* list, double* a, int left, int right) {
double x = a[(left + right) / 2];
int i = left;
int j = right;
do {
while (a[i] < x) i++;
while (a[j] > x) j--;
if (i <= j) {
swap(a[i], a[j]);
swap(list[i], list[j]);
i++;
j--;
}
} while (i < j);
if (left < j) sort(list, a, left, j);
if (i < right) sort(list, a, i, right);
}
int main() {
int n;
cin >> n;
int* xGreen = new int[n + 1];
int* yGreen = new int[n + 1];
int* idexG = new int[n + 1];
for (int i = 1; i <= n; i++) {
cin >> xGreen[i] >> yGreen[i];
idexG[i] = i;
}
int* xRed = new int[n + 1];
int* yRed = new int[n + 1];
int* idexR = new int[n + 1];
for (int i = 1; i <= n; i++) {
cin >> xRed[i] >> yRed[i];
idexR[i] = n + i;
}
//---
for (int i = 1; i <= n; i++) {
double* angle = new double[n + 1];
int* list = new int[n + 1];
for (int j = 1; j <= n; j++) {
double a = yRed[j] - yGreen[i];
double b = xRed[j] - xGreen[i];
list[j] = idexR[j];
if (b == 0) {
angle[j] = MAX;
}
else angle[j] = a / b;
}
sort(list, angle, 1, n);
for (int j = 1; j <= n - 1; j++) {
if (angle[j] == angle[j + 1]) {
cout << idexG[i] << " " << list[j] << " " << list[j + 1] << endl;
return 0;
}
}
}
//---
for (int i = 1; i <= n; i++) {
double* angle = new double[n + 1];
int* list = new int[n + 1];
for (int j = 1; j <= n; j++) {
double a = yGreen[j] - yRed[i];
double b = xGreen[j] - xRed[i];
list[j] = idexG[j];
if (b == 0) {
angle[j] = MAX;
}
else angle[j] = a / b;
}
sort(list, angle, 1, n);
for (int j = 1; j <= n - 1; j++) {
if (angle[j] == angle[j + 1]) {
cout << idexR[i] << " " << list[j] << " " << list[j + 1] << endl;
return 0;
}
}
}
cout << -1 << endl;
return 0;
}