fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5. using ll = long long;
  6.  
  7. // Fonction pour calculer la taille du triangle à l'étape n
  8. ll getSize(ll n) {
  9. if (n == 1) return 2;
  10. return (1LL << n) - 1;
  11. }
  12.  
  13. // Fonction pour déterminer si un point est rouge ou bleu
  14. bool isRed(ll x, ll y) {
  15. // Si x ou y est hors des limites ou y > x, point invalide
  16. if (x < 1 || y < 1 || y > x) return false;
  17.  
  18. // Cas de base : triangle de taille 2 (étape 1)
  19. if (x <= 2) return true;
  20.  
  21. // Trouver l'étape n où ce point apparaît pour la première fois
  22. ll n = 1;
  23. while (getSize(n) < x) n++;
  24.  
  25. // Tant qu'on n'atteint pas l'étape 1
  26. while (n > 1) {
  27. ll size = getSize(n - 1);
  28. ll totalSize = getSize(n);
  29.  
  30. // Si le point est dans le triangle bleu du milieu
  31. if (x > size && x <= totalSize && y > (x - size - 1) && y <= (x - size - 1) + size) {
  32. return false;
  33. }
  34.  
  35. // Transformer les coordonnées pour le sous-triangle approprié
  36. if (x > size) {
  37. if (y <= (x - size - 1)) {
  38. // Triangle gauche
  39. x -= size;
  40. y = y;
  41. } else if (y > (x - size - 1) + size) {
  42. // Triangle droit
  43. x -= size;
  44. y -= ((x - size - 1) + size);
  45. } else {
  46. // Point bleu
  47. return false;
  48. }
  49. }
  50.  
  51. n--;
  52. }
  53.  
  54. return true;
  55. }
  56.  
  57. int main() {
  58. ios_base::sync_with_stdio(false);
  59. cin.tie(nullptr);
  60.  
  61. int Q;
  62. cin >> Q;
  63.  
  64. while (Q--) {
  65. ll x, y;
  66. cin >> x >> y;
  67. cout << (isRed(x, y) ? 1 : 0) << "\n";
  68. }
  69.  
  70. return 0;
  71. }
Success #stdin #stdout 0.01s 5304KB
stdin
6
1 1
5 3
8 2
8 6
5 4
6 4
stdout
1
0
0
0
0
0