/VOI 14 Bài 4 - Trò Chơi Với Những Viên Bi

<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;
        }