#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;
}