Problem:
Counter-Clockwise

For given three points p0, p1, p2, print

COUNTER_CLOCKWISE

if p0, p1, p2 make a counterclockwise turn (1),

CLOCKWISE

if p0, p1, p2 make a clockwise turn (2),

ONLINE_BACK

if p2 is on a line p2, p0, p1 in this order (3),

ONLINE_FRONT

if p2 is on a line p0, p1, p2 in this order (4),

ON_SEGMENT

if p2 is on a segment p0p1 (5).

Input

xp0 yp0 xp1 yp1
q
xp20 yp20
xp21 yp21
...
xp2q-1 yp2q-1

In the first line, integer coordinates of p0 and p1 are given. Then, q queries are given for integer coordinates of p2.

Output

For each query, print the above mentioned status.

Constraints

1 ≤ q ≤ 1000

-10000 ≤ xi, yi ≤ 10000

p0 and p1 are not identical.

Sample Input 1

0 0 2 0
2
-1 1
-1 -1

Sample Output 1

COUNTER_CLOCKWISE
CLOCKWISE

Sample Input 2

0 0 2 0
3
-1 0
0 0
3 0

Sample Output 2

ONLINE_BACK
ON_SEGMENT
ONLINE_FRONT

Solution in C# (judge verdict: Accepted)

using System;

class Program
{
  static readonly int COUNTER_CLOCKWISE = 1;
  static readonly int CLOCKWISE = -1;
  static readonly int ONLINE_BACK = 2;
  static readonly int ONLINE_FRONT = -2;
  static readonly int ON_SEGMENT = 0;

  public class Vector
  {
    public double x, y;
    public Vector(double x, double y)
    {
      this.x = x;
      this.y = y;
    }

    public static Vector operator-(Vector v1, Vector v2)
    {

      return new Vector(v1.x-v2.x, v1.y-v2.y);
    }
  }
  public static double dot(Vector v1, Vector v2)
  {

    return v1.x*v2.x + v1.y*v2.y;
  }

  public static double cross(Vector v1, Vector v2)
  {

    return v1.x*v2.y - v1.y*v2.x;
  }

  public static double norm(Vector v)
  {

    return v.x*v.x + v.y*v.y;
  }

  public static int ccw(Vector p1, Vector p2, Vector p3)
  {
    Vector a = p2 - p1;
    Vector b = p3 - p1;
    if(cross(a, b) > Double.Epsilon) { return COUNTER_CLOCKWISE; }
    if(cross(a, b) < -Double.Epsilon) { return CLOCKWISE; }
    if(dot(a, b)< -Double.Epsilon) { return ONLINE_BACK; }
    if(norm(a) < norm(b)) { return ONLINE_FRONT; }
    return ON_SEGMENT;
  }

  public static void Main()
  {
    string[] s = Console.ReadLine().Split(' ');
    Vector v1 = new Vector(int.Parse(s[0]), int.Parse(s[1]));
    Vector v2 = new Vector(int.Parse(s[2]), int.Parse(s[3]));

    int n = int.Parse(Console.ReadLine());
    for(int i=0; i<n; i++)
      {
	string[] s1 = Console.ReadLine().Split(' ');
        Vector v = new Vector(int.Parse(s1[0]), int.Parse(s1[1]));

	int ans = ccw(v1, v2, v);
	if(ans == COUNTER_CLOCKWISE) {
	  Console.WriteLine("COUNTER_CLOCKWISE");
	}
	if(ans == CLOCKWISE) {
	  Console.WriteLine("CLOCKWISE");
	}
	if(ans == ONLINE_BACK){
	  Console.WriteLine("ONLINE_BACK");
	}
	if(ans == ONLINE_FRONT){
	  Console.WriteLine("ONLINE_FRONT");
	}
	if(ans == ON_SEGMENT){
	  Console.WriteLine("ON_SEGMENT");
	}
      }
  }
}