Language: C++

#include <bits/stdc++.h>
using namespace std;

#define int long long

typedef complex<int> Point;

bool Comp(const Point &p, const Point &q)
{
    if (p.real() != q.real()) return p.real() < q.real();
    return p.imag() < q.imag();
}

int Cross(const Point &p, const Point &q)
{
    return p.real()*q.imag() - p.imag()*q.real();
}

bool IsNG(const Point &p1, const Point &p2, const Point &p3)
{
    return Cross(p2 - p3, p1 - p2) <= 0;
}

double GetDistance(const Point &p, const Point &q)
{
    int dx = p.real() - q.real();
    int dy = p.imag() - q.imag();
    return sqrt(dx*dx + dy*dy);
}

vector<Point> SortReew(vector<Point> ps)
{
    sort(ps.begin(), ps.end(), Comp);
    vector<Point> u;
    for (int i = 0; i < ps.size(); i++)
    {
        while (u.size() > 1 && IsNG(ps[i], u[u.size() - 1], u[u.size() - 2]))
            u.pop_back();
        u.push_back(ps[i]);
    }
    vector<Point> d;
    for (int i = ps.size() - 1; i >= 0; i--)
    {
        while (d.size() > 1 && IsNG(ps[i], d[d.size() - 1], d[d.size() - 2]))
            d.pop_back();
        d.push_back(ps[i]);
    }
    for (int i = 1; i < d.size() - 1; i++)
    {
        u.push_back(d[i]);
    }
    return u;
}

struct UF
{
    vector<int> par;
    UF(int n)
    {
        par.resize(n);
        for (int i = 0; i < n; i++) par[i] = i;
    }
    int Find(int x)
    {
        if (x == par[x]) return x;
        return par[x] = Find(par[x]);
    }
    bool Unite(int a, int b)
    {
        if (Find(a) == Find(b)) return false;
        par[Find(b)] = Find(a);
        return true;
    }
};

int V, R;
map< pair<int, int>, int> m;

struct Edge
{
    int a, b;
    double cost;
    Edge() {}
    Edge(int a, int b, double cost) : a(a), b(b), cost(cost) {}
    bool operator < (const Edge &e) const
    {
        return cost < e.cost;
    }
};

signed main()
{
    cin >> V >> R;
    vector<Point> v(V);
    for (int i = 0; i < V; i++)
    {
        cin >> v[i].real() >> v[i].imag();
        m[make_pair(v[i].real(), v[i].imag())] = i;
    }
    double ans = 0;
    vector<Point> ret = SortReew(v);
    UF uf(V);
    for (int i = 0; i < ret.size(); i++)
    {
        Point p = ret[i];
        Point q = ret[(i+1)%ret.size()];
        int a = m[make_pair(p.real(), p.imag())];
        int b = m[make_pair(q.real(), q.imag())];
        uf.Unite(a,b);
        ans += GetDistance(v[a], v[b]);
        //cout<<"\t"<<a<<" "<<b<<endl;
    }
    //printf("%.20f\n",ans);
    /*for (int i = 0; i < ret.size(); i++)
    {
        printf("%lld %lld\n", ret[i].real(), ret[i].imag());
    }*/
    vector<Edge> es;
    for (int i = 0; i < R; i++)
    {
        int a, b;
        cin >> a >> b; a--; b--;
        es.push_back( Edge(a, b, GetDistance(v[a], v[b]) ));
    }
    sort(es.begin(), es.end());
    for (int i = 0; i < es.size(); i++)
    {
        if (uf.Unite(es[i].a, es[i].b)) ans += es[i].cost;
    }
    printf("%.20f\n", ans);
    return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:97:13: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'long long int')
   97 |         cin >> v[i].real() >> v[i].imag();
      |         ~~~ ^~ ~~~~~~~~~~~
      |         |               |
      |         |               long long int
      |         std::istream {aka std::basic_istream<char>}
In file included from /usr/include/c++/14/sstream:40,
                 from /usr/include/c++/14/complex:45,
                 from /usr/include/c++/14/ccomplex:39,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:127,
                 from a.cc:1:
/usr/include/c++/14/istream:170:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  170 |       operator>>(bool& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:170:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:174:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  174 |       operator>>(short& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:174:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:177:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  177 |       operator>>(unsigned short& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:177:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:181:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  181 |       operator>>(int& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:181:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:184:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  184 |       operator>>(unsigned int& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:184:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:188:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  188 |       operator>>(long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:188:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:192:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  192 |       operator>>(unsigned long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:192:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:199:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  199 |       operator>>(long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:199:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'long long int&' to an rvalue of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:203:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  203 |       operator>>(unsigned long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:203:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:219:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  219 |       operator>>(float& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:219:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'float&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:223:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  223 |       operator>>(double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:223:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'double&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:227:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  227 |       operator>>(long double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:227:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: cannot bind non-const lvalue reference of type 'long double&' to a value of type 'long long int'
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
/usr/include/c++/14/istream:328:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  328 |       operator>>(void*& __p)
      |       ^~~~~~~~
/usr/include/c++/14/istream:328:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: invalid conversion from 'long long int' to 'void*' [-fpermissive]
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
      |                         |
      |                         long long int
a.cc:97:25: error: cannot bind rvalue '(void*)(& v.std::vector<std::complex<long long int> >::operator[](((std::vector<std::complex<long long int> >::size_type)i)))->std::complex<long long int>::real()' to 'void*&'
/usr/include/c++/14/istream:122:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__istream_type& (*)(__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:122:7: note:   conversion of argument 1 would be ill-formed:
a.cc:97:25: error: invalid conversion from 'long long int' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&)' {aka 'std::basic_istream<char>& (*)(std::basic_istream<char>&)'} [-fpermissive]
   97 |         cin >> v[i].real() >> v[i].imag();
      |                ~~~~~~~~~^~
      |                         |
      |                         long long int
/usr/include/c++/14/istream:126:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__ios_type& (*)(__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>; __ios_type = std::basic_ios<char