#include <iostream>
#include <math.h>
#include <vector>

using namespace std;

// 2次元ベクトルクラス
class Vector {
public:
    float x, y;
    
    Vector() {
        x = 0.0;
        y = 0.0;
    }
    
    Vector(float nx, float ny) {
        x = nx;
        y = ny;
    }
    
    void set(float nx, float ny) {
        x = nx;
        y = ny;
    }
    
    void setX(float nx) {
        x = nx;
    }
    
    void setY(float ny) {
        y = ny;
    }
    
    // 外積を求める
    float cross(const Vector& vec) const {
        return x * vec.y - y * vec.x;
    }
    
    // ベクトルの大きさを求める
    float norm() const {
        return sqrt(x * x + y * y);
    }
    
    // 単位ベクトルを返す
    Vector getUnit() const {
        Vector v;
        float n = norm();
        if (n == 0.0) {
            v.set(0.0, 0.0);
        } else {
            v.set(x / n, y / n);
        }
        return v;
    }
    
    
    void operator = (const Vector& vec) {
        x = vec.x;
        y = vec.y;
    }
    
    Vector operator + (const Vector& vec) const {
        Vector v(x + vec.x, y + vec.y);
        return v;
    }
    
    Vector operator - (const Vector& vec) const {
        Vector v(x - vec.x, y - vec.y);
        return v;
    }
    
    Vector operator * (const Vector& vec) const {
        Vector v(x * vec.x, y * vec.y);
        return v;
    }
    
    Vector operator * (float f) const {
        Vector v(x * f, y * f);
        return v;
    }
    
    Vector operator / (const Vector& vec) const {
        Vector v;
        if (vec.x == 0.0) {
            v.setX(0.0);
        } else {
            v.setX(x / vec.x);
        }
        
        if (vec.y == 0.0) {
            v.setY(0.0);
        } else {
            v.setY(y / vec.y);
        }
        return v;
    }
    
    Vector operator / (float f) const {
        Vector v;
        if (f == 0.0) {
            v.set(0.0, 0.0);
        } else {
            v.set(x / f, y / f);
        }
        return v;
    }
    
    void operator += (const Vector& vec) {
        x += vec.x;
        y += vec.y;
    }
    
    void operator -= (const Vector& vec) {
        x -= vec.x;
        y -= vec.y;
    }
    
    void operator *= (const Vector& vec) {
        x *= vec.x;
        y *= vec.y;
    }
    
    void operator /= (const Vector& vec) {
        if (vec.x == 0.0) {
            x = 0.0;
        } else {
            x /= vec.x;
        }
        
        if (vec.y == 0.0) {
            y = 0.0;
        } else {
            y /= vec.y;
        }
    }
    
    bool operator == (const Vector& vec) const {
        if (x == vec.x && y == vec.y) {
            return true;
        } else {
            return false;
        }
    }
};

class LineSegment {
private:
    Vector start; // 始点
    Vector end; // 終点
    
public:
    //コンストラクタ
    LineSegment () {}
    
    // 始点と終点を設定する
    void setStartEnd(float sx, float sy, float ex, float ey) {
        start.set(sx, sy);
        end.set(ex, ey);
    }
    
    // 始点を取得する
    Vector getStart() const {
        return start;
    }
    
    //　終点を取得する
    Vector getEnd() const {
        return end;
    }
    
    // 指定の線分を含むか
    // このメソッドは線分同士が平行の時しか使用しない
    bool isInLine(const LineSegment& l) const {
        bool b1 = isPointInLine(l.getStart());
        bool b2 = isPointInLine(l.getEnd());
        if (b1 || b2) {
            return true;
        } else {
            return false;
        }
    }
    
    bool isPointInLine(const Vector& p) const {
        if (start == p) {
            return true;
        }
        
        Vector l1 = end - start;
        Vector l2 = p - start;
        Vector u1 = l1.getUnit();
        Vector u2 = l2.getUnit();

        if (u1 == u2 && l2.norm() <= l1.norm()) {
            return true;
        } else {
            return false;
        }
    }
    
    // 指定の線分と交差しているか
    // @return 0(交差していない), 1(交差している)
    int isCross(const LineSegment& l) {
        Vector l1 = end - start;
        float c1 = l1.cross(l.getStart() - start);
        float c2 = l1.cross(l.getEnd() - start);
        
        Vector l2 = l.getEnd() - l.getStart();
        float c3 = l2.cross(start - l.getStart());
        float c4 = l2.cross(end - l.getStart());
        
        if (c1 * c2 == 0.0 && c3 * c4 == 0.0) { // 平行のとき
            LineSegment ls;
            ls.setStartEnd(start.x, start.y, end.x, end.y);
            if (isInLine(l) || l.isInLine(ls)) {
                return 1;
            }
            return 0;
        } else if ((c1 * c2 < 0.0 && c3 * c4 <= 0.0)
                   || (c1 * c2 <= 0.0 && c3 * c4 < 0.0)
                   || (c1 * c2 < 0.0 && c3 * c4 < 0.0)) { // 交差するとき
            return 1;
        } else { // 交差しないとき
            return 0;
        }
    }
};

int main() {
    int n;
    cin >> n;
    
    LineSegment l1, l2;
    vector<int> result;
    for (int i = 0; i < n; i++) {
        float sx1, sy1, ex1, ey1, sx2, sy2, ex2, ey2;
        cin >> sx1 >> sy1 >> ex1 >> ey1 >> sx2 >> sy2 >> ex2 >> ey2;
        l1.setStartEnd(sx1, sy1, ex1, ey1);
        l2.setStartEnd(sx2, sy2, ex2, ey2);
        result.push_back(l1.isCross(l2));
    }
    
    for (int i = 0; i < result.size(); i++) {
        cout << result[i] << endl;
    }
    return 0;
}


Measured memory_bytes: 3248