Go: package main

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

var scanner = bufio.NewScanner(os.Stdin)

var (
	dx = []int{0, -1, 0, 1}
	dy = []int{1, 0, -1, 0}
)

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		w, _ := strconv.Atoi(buf[0])
		h, _ := strconv.Atoi(buf[1])
		if w == 0 && h == 0 {
			break
		}
		scanner.Scan()
		buf_ := strings.Split(scanner.Text(), " ")
		xs, _ := strconv.Atoi(buf_[0])
		ys, _ := strconv.Atoi(buf_[1])
		scanner.Scan()
		buf__ := strings.Split(scanner.Text(), " ")
		xg, _ := strconv.Atoi(buf__[0])
		yg, _ := strconv.Atoi(buf__[1])
		xs--
		ys--
		xg--
		yg--
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		field := make([][]int, 100)
		for i := range  field {
			field[i] = make([]int, 100)
		}
		visited := make([][]bool, 100)
		for i := range visited {
			visited[i] = make([]bool, 100)
		}
		for i := 0; i < n; i++ {
			scanner.Scan()
			buf___ := strings.Split(scanner.Text(), " ")
			c, _ := strconv.Atoi(buf___[0])
			d, _ := strconv.Atoi(buf___[1])
			x, _ := strconv.Atoi(buf___[2])
			y, _ := strconv.Atoi(buf___[3])
			x--
			y--
			switch d {
			case 0:
				for j := 0; j < 4; j++ {
					for k := 0; k < 2; k++ {
						field[x+j][y+k] = c
					}
				}
			case 1:
				for j := 0; j < 2; j++ {
					for k := 0; k < 4; k++ {
						field[x+j][y+k] = c
					}
				}
			}
		}
		if field[xs][ys] != field[xg][yg] || // スタートとゴールの色が等しくないと"NG"
			field[xs][ys] == 0 { // スタートの色が無職
			fmt.Println("NG")
			continue
		}
		Q := make([]Entry, 0)
		visited[xs][ys] = true
		Q = append(Q, Entry{xs, ys})
		for len(Q) > 0 {
			row := Q[0].x
			col := Q[0].y
			Q = Q[1:]
			for i := 0; i < 4; i++ {
				if 0 <= row+dx[i] && row+dx[i] < w &&
					0 <= col+dy[i] && col+dy[i] < h && // 移動可能な範囲内かどうか
					!visited[row + dx[i]][col + dy[i]] && // 訪問済みか
					field[row+dx[i]][col+dy[i]]==field[row][col] { // 色が同じかどうか
						visited[row+dx[i]][col+dy[i]] = true
						Q = append(Q, Entry{row+dx[i],col+dy[i]})
				}
			}
		}
		if visited[xg][yg] {
			fmt.Println("OK")
		} else {
			fmt.Println("NG")
		}
	}
}

type Entry struct {
	x, y int
}

C++: #include <iostream>
#include <vector>
#include <string>
using namespace std;



typedef vector<vector<int> > Matrix;
int w,h,xs,ys,xg,yg,n,flag;

class Block{
public:
  int color;
  int direction;
  int x,y,dx,dy;
  void write(Matrix &board){
    if(direction == 0)
      dx = 4,dy = 2;
    else if(direction == 1)
      dx = 2,dy = 4;
    for(int i=0; i<dx; ++i){
      for(int j=0; j<dy; ++j){
	(board.at(x+i)).at(y+j) = color;
      }
    }
  }
};
  
void func(Matrix &board,int nx,int ny){
  if( nx==xg && ny==yg) flag = 1;
  else if( w<=nx+1 || h<=ny+1) return;
  if(board[nx][ny]==board[nx+1][ny])
    func(board,nx+1,ny);
  if(board[nx][ny]==board[nx][ny+1])
    func(board,nx,ny+1);
}


int main(void){
  string res;
  while(1){
    cin >> w >> h;
    if( w==0 && h==0) return 0;
    cin >> xs >> ys >> xg >> yg >> n;
    Block *object;
    object = new Block[n];
    Matrix board(w, vector<int>(h,0));
    for(int i=0; i<n; ++i){
      cin >> object[i].color;
      cin >> object[i].direction;
      cin >> object[i].x;
      cin >> object[i].y;
      object[i].write(board);
    }
    func(board,xs,ys);
    if(flag==1) res = "OK";
    else res = "NG";
    cout << res << endl;
    flag = 0;
    delete[] object;
    board.clear();
  }
}

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

int main() {
    int H, W;
    while (cin >> W >> H, H || W) {
        int sx, sy, gx, gy;
        cin >> sx >> sy >> gx >> gy;
        int M;
        cin >> M;
        vector<vector<int> > d(W+1, vector<int>(H+1));
        vector<vector<int> > used(W+1, vector<int>(H+1));

        for (int i = 0; i < M; i++) {
            int c, dir, x, y;
            cin >> c >> dir >> x >> y;
            if (!dir) {
                for (int j = 0; j < 4; j++) {
                    for (int k = 0; k < 2; k++) {
                        d[x + j][y + k] = c;
                    }
                }
            } else {
                for (int j = 0; j < 2; j++) {
                    for (int k = 0; k < 4; k++) {
                        d[x + j][y + k] = c;
                    }
                }
            }
        }

        int dx[] = {0, 1, 0, -1};
        int dy[] = {1, 0, -1, 0};

        queue<int> qx, qy;
        qx.push(sx);
        qy.push(sy);

        while (qx.size()) {
            int x = qx.front(); qx.pop();
            int y = qy.front(); qy.pop();

            if (used[x][y]) continue;
            used[x][y] = 1;

            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                if (0 < nx && nx <= W && 0 < ny && ny <= H && !used[nx][ny] && d[x][y] == d[nx][ny]) {
                    qx.push(nx);
                    qy.push(ny);
                }
            }
        }

        if (d[gx][gy] > 0 && used[gx][gy]) cout << "OK" << endl;
        else cout << "NG" << endl;
    }

    return 0;
}

C++: #include <iostream>
int m[101][101],w,h,r,gx,gy;
void dfs(int x,int y,int c){
	if(!(x-gx)&&!(y-gy)){r=1;return ;}
	if(x>1&&m[x-1][y]==c)m[x-1][y]=0,dfs(x-1,y,c);
	if(x<=w&&m[x+1][y]==c)m[x+1][y]=0,dfs(x+1,y,c);
	if(y>1&&m[x][y-1]==c)m[x][y-1]=0,dfs(x,y-1,c);
	if(y<=h&&m[x][y+1]==c)m[x][y+1]=0,dfs(x,y+1,c);
	return ;
}

int main(){
	//whÍ{[hÌå«³AnÍubNÌÂ
	int n,c,d,sx,sy,bx,by;
	
	while(std::cin>>w>>h,w&&h){
		for(int y=0;y<101;y++){
			for(int x=0;x<101;x++){
				m[x][y] = 0;
			}
		}
		r=0;
		std::cin>>sx>>sy;
		std::cin>>gx>>gy;
		std::cin>>n;
		for(int i=0;i<n;i++){
			std::cin>>c>>d>>bx>>by;
			int bw,bh;
			if(d)bw=2,bh=4;
			else{bh=2,bw=4;}
			for(int y=by;y<=by+bh;y++){
				for(int x=bx;x<=bx+bw;x++){
					m[x][y] = c;
				}
			}
		}
		if(m[sx][sy])c = m[sx][sy],m[sx][sy]=0,dfs(sx,sy,c);
		if(r)std::cout<<"OK"<<std::endl;
		else{std::cout<<"NG"<<std::endl;}
	}
	return 0;
}

C++: #include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#include <ctime>
#include <list>
#include <numeric>
#include <utility>
#include <ctime>
#define INF 100000000
#define LINF 9000000000000000000
#define mod 1000000007
 
#define rep(i,n) for(int i=0;i<int(n);i++)
#define REP(i,a,b) for(int i=(a);i<int(b);i++)
#define all(x) (x).begin(),x.end()
#define pb push_back
#define mp make_pair
#define MOD(x) (x%(mod))
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int,int> pi;
 
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
bool debug=false;

/*---------------------------------------------------*/

int maze[105][105];
int w,h,xs,ys,xg,yg;

void init(){
  rep(i,105){
    rep(j,105){
      maze[i][j]=-1;
    }
  }
}

void DEBUG(){
  rep(i,h){
    rep(j,w)cout<<maze[i][j]<<" ";
    cout<<endl;
  }
}

bool bfs(int c){
  //DEBUG();
  queue<int>que;
  que.push(xs);
  que.push(ys);
  while(que.size()){
    //cout<<c<<endl;
    int x=que.front();que.pop();
    int y=que.front();que.pop();
    if(x==xg&&y==yg)return true;
    for(int i=0;i<4;i++){
      if(0<x+dx[i]&&x+dx[i]<=w&&0<y+dy[i]&&y+dy[i]<=h&&maze[y+dy[i]][x+dx[i]]==c&&maze[y+dy[i]][x+dx[i]]!=-1){
	que.push(x+dx[i]);
	que.push(y+dy[i]);
	maze[y+dy[i]][x+dx[i]]=-1;
      }
    }
  }
  return false;
}

int main(){
  int n,c,d,x,y;
  while(cin>>w>>h){
    if(w==0&&h==0)break;
    init();
    cin>>xs>>ys;
    cin>>xg>>yg;
    cin>>n;
    rep(i,n){
      cin>>c>>d>>x>>y;
      if(d==0){
	rep(j,2){
	  rep(k,4){
	    maze[y+j][x+k]=c;
	  }
	}
      }else if(d==1){
	rep(j,4){
	  rep(k,2){
	    maze[y+j][x+k]=c;
	  }
	}
      }
    }
    if(bfs(maze[ys][xs]))cout<<"OK"<<endl;
    else cout<<"NG"<<endl;
  }
  return 0;
}