#include <bits/stdc++.h>
using namespace std;
const double eps=1e-8;
struct node {
	int x,y;
}p[4];
bool cmp1(node a,node b) {
	if(a.x != b.x) return a.x<b.x;
	return a.y<b.y;
}
int cmp(node a,node b) {
	if(a.x == b.x && a.y == b.y) return 0;
	else if(a.x < b.x || (a.x == b.x && a.y < b.y)) return -1;//可能要根据题目把判断条件改一改
	else return 1;
}
double compute(double x,double y,double x2,double y2) {
	return (x * y2) - (y * x2);
}
int main() {
	int t;
	scanf("%d",&t);
	while(t--) {
		for(int i=0;i<4;i++) {
			scanf("%d%d",&p[i].x,&p[i].y);
		}
		
		sort(p,p+2,cmp1); sort(p+2,p+4,cmp1);
		
		bool flag;
		if(!cmp(p[0],p[2]) || !cmp(p[0],p[3]) || !cmp(p[1],p[2]) || !cmp(p[1],p[3])) {
			flag = true;
		}
		else {//没有重合
			double res = compute(p[1].x-p[0].x, p[1].y-p[0].y, p[3].x-p[2].x, p[3].y-p[2].y); 
			if(res == 0) {//两线段平行
				double tmp = compute(p[1].x-p[0].x, p[1].y-p[0].y, p[3].x-p[0].x, p[3].y-p[0].y);
				if(tmp == 0) {//共线
					if(cmp(p[0],p[2])<=0 && cmp(p[2],p[1])<=0 || cmp(p[2],p[0])<=0 && cmp(p[0],p[3])<=0)
						flag = 1;
					else 
						flag = 0;
				}
				else 
					flag = 0;
			}
			else {
				node vector01, vector23;
				vector01.x = p[1].x - p[0].x; vector01.y = p[1].y - p[0].y;
				vector23.x = p[3].x - p[2].x; vector23.y = p[3].y - p[2].y;
				double res0, res1, res2, res3;
				res0 = compute(p[2].x-p[0].x, p[2].y-p[0].y, vector01.x, vector01.y);
				res1 = compute(p[3].x-p[0].x, p[3].y-p[0].y, vector01.x, vector01.y);
				res2 = compute(p[1].x-p[2].x, p[1].y-p[2].y, vector23.x, vector23.y);
				res3 = compute(p[0].x-p[2].x, p[0].y-p[2].y, vector23.x, vector23.y);
				
				if(res0*res1<=0 && res2*res3<=0)
					flag = 1;
				else 
					flag = 0;
			}
		}
	}
	return 0;
}