#include <iostream>
  #include <cstdio>
  #include <vector>
  #include <algorithm>

  struct point {
    int x;
    int y;

    point (int xx=0, int yy=0) {
      x = xx;
      y = yy;
    }

    point operator - (point &other) {
      return point(x - other.x, y - other.y);
    }

    long long len() {
      return x * x + y * y;
    }

    long long operator * (point &other) {
      return x * other.y - y * other.x;
    }
  };

  int main() {

    std::vector<point> pts;
    for (int i = 0; i < 10; ++i) {
      y = rand() % 10;
      pts.emplace_back(i, y);
      pts.emplace_back(i, y);
    }

    point leftmost = point(0, 0);

    // ============== Удалить все повторения =============================
    pts.resize(std::unique(pts.begin(), pts.end(), [](point &a, point b) {
      return a.x == b.x && a.y == b.y;
    }) - pts.begin());

    // ===================== Отсортировать по полярному углу =============
    std::sort(pts.begin(), pts.end(), [leftmost](point &a, point &b) {
      return ((a - leftmost) * (b - leftmost) > 0) ||
             (((a - leftmost) * (b - leftmost) == 0) && (a.len() < b.len()));
    });

    return 0;
  }