#include <iostream>
using namespace std;
using ll = long long;
bool isRed(ll x, ll y) {
// Cas de base pour le sommet
if (x == 1 && y == 1) return true;
// Trouver le niveau du triangle qui contient le point
ll level = 1;
ll size = 2;
while (size <= x) {
level++;
size = size * 2 + 1;
}
// Pour chaque niveau, déterminer si le point est dans un triangle rouge ou bleu
while (level > 1) {
size = (1LL << level) - 1; // Taille du triangle à ce niveau
ll prevSize = (1LL << (level-1)) - 1; // Taille du triangle au niveau précédent
// Si le point est dans la partie inférieure
if (x > prevSize) {
// Vérifier si le point est dans le triangle bleu du milieu
ll middleStart = prevSize + 1;
ll offset = x - middleStart;
if (y > offset && y <= offset + prevSize) {
return false;
}
// Ajuster les coordonnées pour les sous-triangles
if (y <= offset) {
// Triangle gauche
x = x - prevSize;
y = y;
} else if (y > offset + prevSize) {
// Triangle droit
x = x - prevSize;
y = y - (offset + prevSize);
}
}
level--;
}
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int Q;
cin >> Q;
while (Q--) {
ll x, y;
cin >> x >> y;
cout << isRed(x, y) << '\n';
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmJvb2wgaXNSZWQobGwgeCwgbGwgeSkgewogICAgLy8gQ2FzIGRlIGJhc2UgcG91ciBsZSBzb21tZXQKICAgIGlmICh4ID09IDEgJiYgeSA9PSAxKSByZXR1cm4gdHJ1ZTsKICAgIAogICAgLy8gVHJvdXZlciBsZSBuaXZlYXUgZHUgdHJpYW5nbGUgcXVpIGNvbnRpZW50IGxlIHBvaW50CiAgICBsbCBsZXZlbCA9IDE7CiAgICBsbCBzaXplID0gMjsKICAgIHdoaWxlIChzaXplIDw9IHgpIHsKICAgICAgICBsZXZlbCsrOwogICAgICAgIHNpemUgPSBzaXplICogMiArIDE7CiAgICB9CiAgICAKICAgIC8vIFBvdXIgY2hhcXVlIG5pdmVhdSwgZMOpdGVybWluZXIgc2kgbGUgcG9pbnQgZXN0IGRhbnMgdW4gdHJpYW5nbGUgcm91Z2Ugb3UgYmxldQogICAgd2hpbGUgKGxldmVsID4gMSkgewogICAgICAgIHNpemUgPSAoMUxMIDw8IGxldmVsKSAtIDE7IC8vIFRhaWxsZSBkdSB0cmlhbmdsZSDDoCBjZSBuaXZlYXUKICAgICAgICBsbCBwcmV2U2l6ZSA9ICgxTEwgPDwgKGxldmVsLTEpKSAtIDE7IC8vIFRhaWxsZSBkdSB0cmlhbmdsZSBhdSBuaXZlYXUgcHLDqWPDqWRlbnQKICAgICAgICAKICAgICAgICAvLyBTaSBsZSBwb2ludCBlc3QgZGFucyBsYSBwYXJ0aWUgaW5mw6lyaWV1cmUKICAgICAgICBpZiAoeCA+IHByZXZTaXplKSB7CiAgICAgICAgICAgIC8vIFbDqXJpZmllciBzaSBsZSBwb2ludCBlc3QgZGFucyBsZSB0cmlhbmdsZSBibGV1IGR1IG1pbGlldQogICAgICAgICAgICBsbCBtaWRkbGVTdGFydCA9IHByZXZTaXplICsgMTsKICAgICAgICAgICAgbGwgb2Zmc2V0ID0geCAtIG1pZGRsZVN0YXJ0OwogICAgICAgICAgICBpZiAoeSA+IG9mZnNldCAmJiB5IDw9IG9mZnNldCArIHByZXZTaXplKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIEFqdXN0ZXIgbGVzIGNvb3Jkb25uw6llcyBwb3VyIGxlcyBzb3VzLXRyaWFuZ2xlcwogICAgICAgICAgICBpZiAoeSA8PSBvZmZzZXQpIHsKICAgICAgICAgICAgICAgIC8vIFRyaWFuZ2xlIGdhdWNoZQogICAgICAgICAgICAgICAgeCA9IHggLSBwcmV2U2l6ZTsKICAgICAgICAgICAgICAgIHkgPSB5OwogICAgICAgICAgICB9IGVsc2UgaWYgKHkgPiBvZmZzZXQgKyBwcmV2U2l6ZSkgewogICAgICAgICAgICAgICAgLy8gVHJpYW5nbGUgZHJvaXQKICAgICAgICAgICAgICAgIHggPSB4IC0gcHJldlNpemU7CiAgICAgICAgICAgICAgICB5ID0geSAtIChvZmZzZXQgKyBwcmV2U2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV2ZWwtLTsKICAgIH0KICAgIAogICAgcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgCiAgICBpbnQgUTsKICAgIGNpbiA+PiBROwogICAgCiAgICB3aGlsZSAoUS0tKSB7CiAgICAgICAgbGwgeCwgeTsKICAgICAgICBjaW4gPj4geCA+PiB5OwogICAgICAgIGNvdXQgPDwgaXNSZWQoeCwgeSkgPDwgJ1xuJzsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0=