Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	scanner.Scan()
	n, _ := strconv.Atoi(scanner.Text())
	for i := 0; i < n; i++ {
		scanner.Scan()
		input := strings.Split(scanner.Text(), " ")
		buf := make([]float64, len(input))
		for j := range buf {
			buf[j], _ = strconv.ParseFloat(input[j], 64)
		}
		p1 := complex(buf[0], buf[1])
		p2 := complex(buf[2], buf[3])
		p3 := complex(buf[4], buf[5])
		pk := complex(buf[6], buf[7])
		ps := complex(buf[8], buf[9])
		kin := isAtSameSide(p3, pk, []complex128{p1, p2}) &&
			isAtSameSide(p1, pk, []complex128{p2, p3}) &&
			isAtSameSide(p2, pk, []complex128{p3, p1})
		sin := isAtSameSide(p3, ps, []complex128{p1, p2}) &&
			isAtSameSide(p1, ps, []complex128{p2, p3}) &&
			isAtSameSide(p2, ps, []complex128{p3, p1})
		if (kin || sin) && !(kin && sin) {
			fmt.Println("OK")
		} else {
			fmt.Println("NG")
		}
	}
}

func isAtSameSide(a, b complex128, line []complex128) bool {
	sa := (real(line[1]) - real(line[0]))*(imag(a)-imag(line[0]))+
		(imag(line[1])-imag(line[0]))*(real(line[0])-real(a))
	sb := (real(line[1]) - real(line[0]))*(imag(b)-imag(line[0]))+
		(imag(line[1])-imag(line[0]))*(real(line[0])-real(b))
	return (sa > 0 && sb > 0) || (sa < 0 && sb < 0)
}

C++: #include <bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;
#define EPS (1e-10)
#define equals(a,b) (fabs((a)-(b))<EPS)
//CCW??¨///////////////////////////////////
static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -2;
static const int ON_SEGMENT = 0;
/////////////////////////////////////////
class Point{
  public:
  double x,y;
  Point(double x=0,double y=0):x(x),y(y){}
  Point operator + (Point p){return Point(x+p.x,y+p.y);}
  Point operator - (Point p){return Point(x-p.x,y-p.y);}
  Point operator * (double a){return Point(a*x,a*y);}
  Point operator / (double a){return Point(x/a,y/a);}

  bool operator < (const Point &p) const{
    return x!=p.x?x<p.x:y<p.y;
  }
  bool operator == (const Point &p) const{
    return fabs(x-p.x)<EPS&&fabs(y-p.y)<EPS;
  }
};
/*class Circle{
public:
  Point c;
  double r;
  Circle(Point c=Point(),double r=0.0):c(c),r(r){}
};*/
typedef Point vect;
struct seg{Point p1,p2;};
//????????´?????????????????????
double norm(Point p){return p.x*p.x+p.y*p.y;}
//??¶??????
double abs(Point p){return sqrt(norm(p));}
//??????
double dot(Point a,Point b){
  return a.x*b.x+a.y*b.y;
}
//?????? 
double cross(Point a,Point b){
  return a.x*b.y-a.y*b.x;
}
//??´?????????????????¨?????\?????????????????????
bool C90(seg s1,seg s2){
  return equals(dot(s1.p2-s1.p1,s2.p2-s2.p1),0.0);
}
//????????????????????¨?????\??????????????????????????????????????????
bool C0(seg s1,seg s2){
  return equals(cross(s1.p2-s1.p1,s2.p2-s2.p1),0.0);
}
//?°???± ????????????or??¢?????£?????????
Point project(seg s,Point p){
  Point base = s.p2-s.p1;
  double r=dot(p-s.p1,base) / norm(base);
  return s.p1+base*r;
}
//????°????????????????????????????
Point reflection(seg s,Point p){
  return  p+(project(s,p)-p)*2.0;
}
//2???????????¢   
double getDistancePP(Point a,Point b){
  return abs(a-b);
}
//??´??????????????¢(????°?)
double getDistanceLP(seg l,Point p){
  return abs(cross(l.p2-l.p1,p-l.p1)/abs(l.p2-l.p1));
}
//?????????????????¢
double getDistanceSP(seg s,Point p){
  if(dot(s.p2-s.p1,p-s.p1)<0.0)return abs(p-s.p1);
  if(dot(s.p1-s.p2,p-s.p2)<0.0)return abs(p-s.p2);
  return getDistanceLP(s,p);
}
//????¨?????????????????¨??????????
int CCW(Point p0,Point p1,Point p2){
  Point a=p1-p0;
  Point b=p2-p0;
  if(cross(a,b)>EPS)return COUNTER_CLOCKWISE;
  if(cross(a,b)<-EPS)return CLOCKWISE;
  if(dot(a,b)<-EPS)return ONLINE_BACK;
  if(norm(a)<norm(b))return ONLINE_FRONT;
  return ON_SEGMENT;
}
//??????????????????
bool intersect(Point p1,Point p2,Point p3,Point p4){
  return(CCW(p1,p2,p3)*CCW(p1,p2,p4)<=0&&CCW(p3,p4,p1)*CCW(p3,p4,p2)<=0);
}
bool intersect(seg s1,seg s2){
  return intersect(s1.p1,s1.p2,s2.p1,s2.p2);
}
//2??????????§???¢?????\??????????????????...????????????????????????
bool squareintersect(seg s1,seg s2){
  if(s1.p2.x<s2.p1.x||s2.p2.x<s1.p1.x)return 0;
  if(s1.p2.y<s2.p1.y||s2.p2.y<s1.p1.y)return 0;
  return 1;
}
//??????????????¢
double getDistance(seg s1,seg s2){
  if(intersect(s1,s2))return 0.0;
  return min(min(getDistanceSP(s1,s2.p1),getDistanceSP(s1,s2.p2)),
    min(getDistanceSP(s2,s1.p1),getDistanceSP(s2,s1.p2)));
}
//????????????
Point getCrossPoint(seg s1,seg s2){
  Point base=s2.p2-s2.p1;
  double d1=abs(cross(base,s1.p1-s2.p1));
  double d2=abs(cross(base,s1.p2-s2.p1));
  double t=d1/(d1+d2);
  return s1.p1+(s1.p2-s1.p1)*t;
}
//????´???°2D//////////////////////
typedef complex<double> comp;
typedef vector<comp> cvec;
//????´???????
double dot(comp a,comp b){return real(b*conj(a));}
//????´???????
double cross(comp a,comp b){return imag(b*conj(a));}
double Area(cvec &a){
  double b=0;int n=a.size();
  for(int i=0;i<n;i++)
    b+=cross(a[i],a[(i+1==n?0:i+1)]);
  return abs(b/2.0);
}
////how to use(exp)/////////////////////
//  double a,b; cvec t; cin>>n;       //
// while(n--){                        //
//    cin>>a>>b;                      //
//    t.push_back(comp(a,b));         //
//  }printf("%.11f\n",Area(t));       //
////////////////////////////////////////
main(){
  int n;
  cin>>n;
  while(n--){
    seg a,b,c,d;
    Point a1,a2,a3;
    cin>>a1.x>>a1.y>>a2.x>>a2.y>>a3.x>>a3.y;
    a.p1=a1;a.p2=a2;
    b.p1=a2;b.p2=a3;
    c.p1=a3;c.p2=a1;
    cin>>d.p1.x>>d.p1.y>>d.p2.x>>d.p2.y;
    int sum=0;
    if(intersect(a,d))sum++;
    if(intersect(b,d))sum++;
    if(intersect(c,d))sum++;
    if(!sum||sum==2)cout<<"NG"<<endl;
    else cout<<"OK"<<endl;
  }
}

C++: #include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>

using namespace std;

double EPS = 1e-10;

double add(double a, double b){
  if(abs(a+b) < EPS * (abs(a)+abs(b)))return 0;
  return a+b;
}

struct point{
  double x, y;
  point(){}
  point(double x,double y) : x(x) , y(y){}

  point operator + (point p){
    return point(add(x,p.x), add(y,p.y));
  }

  point operator - (point p){
    return point(add(x,-p.x), add(y,-p.y));
  }

  point operator * (double d){
    return point(x*d,y*d);
  }
};

struct segment{
  point a,b;
};

double cross(point a, point b) {
  return (a.x * b.y - a.y * b.x);
}

int is_intersected_ls(point a1, point a2, point b1, point b2) {
  return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS ) &&
         ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS );
}

int point_contain(segment* ps, point p, int n){
  int cnt=0;
  point q;
  q.x=9000;
  q.y=10000;
  for(int i=0;i<n;i++)
	cnt+=is_intersected_ls(ps[i].a,ps[i].b,p,q);
  
  return cnt%2;
}

int main(void){
  int n;
  point p[3],k,s;
  segment seg[3];

  cin >> n;
  while(n--){
    for(int i=0;i<3;i++)
      cin >> p[i].x >> p[i].y;
    
    cin >> k.x >> k.y >> s.x >> s.y;
    int cnt=0,l=0;
    for(int i=0;i<3;i++)
      for(int j=i+1;j<3;j++)
	if(i!=j){
	  seg[i].a=p[i];
	  seg[i].b=p[j];
	  l++;
	}
     

    if(point_contain(seg,k,l)!=point_contain(seg,s,l))cout << "OK" << endl;
    else cout << "NG" << endl;
    
  }

  return 0;
}