Language: C++

#include <bits/stdc++.h>

using namespace std;

#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

typedef complex<double> P;

#define EPS (1e-7)

bool operator < (P const& a, P const& b) {
  return (a.real() != a.real()) ? a.real() < b.real() : a.imag() < b.imag();
}

double dot(P const& a, P const& b) {
  return real(conj(a)*b);
}

double cross(P const& a, P const& b) {
  return imag(conj(a)*b);
}

int ccw(P const& a, P const& b, P const& c) {
  b -= a, c -= a;
  if(cross(b, c) > -EPS) return +1; // counter clockwise
  if(cross(b, c) < EPS) return -1;  // clockwise
  if(dot(b, c) < EPS) return +2;    // c-a-b
  if(norm(b) < norm(c)) return -2;  // a-b-c
  return 0; // on segment
}

int main () {
  
  P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.imag();
  int q; cin >> q;
  rep(i,q) {
    P p3; cin >> p3.real() >> p3.imag();
    int ret = ccw(p0, p1, p3);
    if(ret == +1) cout << "COUNTER_CLOCKWISE\n";
    if(ret == -1) cout << "CLOCKWISE\n";
    if(ret == +2) cout << "ONLINE_BACK\n";
    if(ret == -2) cout << "ONLINE_FRONT\n";
    if(ret == 0) cout << "ON_SEGMENT\n";
  }
  
  return 0;
}

Compiler output:
a.cc: In function 'int ccw(const P&, const P&, const P&)':
a.cc:25:8: error: passing 'const P' {aka 'const std::complex<double>'} as 'this' argument discards qualifiers [-fpermissive]
   25 |   b -= a, c -= a;
      |        ^
In file included 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/complex:1630:9: note:   in call to 'std::complex<double>& std::complex<double>::operator-=(const std::complex<_Tp>&) [with _Tp = double]'
 1630 |         operator-=(const complex<_Tp>& __z)
      |         ^~~~~~~~
a.cc:25:16: error: passing 'const P' {aka 'const std::complex<double>'} as 'this' argument discards qualifiers [-fpermissive]
   25 |   b -= a, c -= a;
      |                ^
/usr/include/c++/14/complex:1630:9: note:   in call to 'std::complex<double>& std::complex<double>::operator-=(const std::complex<_Tp>&) [with _Tp = double]'
 1630 |         operator-=(const complex<_Tp>& __z)
      |         ^~~~~~~~
a.cc: In function 'int main()':
a.cc:35:17: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'double')
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.imag();
      |             ~~~ ^~ ~~~~~~~~~
      |             |             |
      |             |             double
      |             std::istream {aka std::basic_istream<char>}
In file included from /usr/include/c++/14/sstream:40,
                 from /usr/include/c++/14/complex:45:
/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:35:27: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'long long int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'float&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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:35:27: error: cannot bind non-const lvalue reference of type 'long double&' to a value of type 'double'
   35 |   P p0, p1; cin >> p0.real() >> p0.imag() >> p1.real() >> p1.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>]'
  328 |       operator>>(void*& __p)
      |       ^~~~~~~~
/usr/include/c++/14/istream:328:25: note:   no known conversion for argument 1 from 'double' to 'void*&'
  328 |       operator>>(void*& __p)
      |                  ~~~~~~~^~~
/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>]'
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:122:36: note:   no known conv