fork download
  1. #include <iostream>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. bool isRed(ll x, ll y) {
  6. // Cas de base pour le sommet
  7. if (x == 1 && y == 1) return true;
  8.  
  9. // Trouver le niveau du triangle qui contient le point
  10. ll level = 1;
  11. ll size = 2;
  12. while (size <= x) {
  13. level++;
  14. size = size * 2 + 1;
  15. }
  16.  
  17. // Pour chaque niveau, déterminer si le point est dans un triangle rouge ou bleu
  18. while (level > 1) {
  19. size = (1LL << level) - 1; // Taille du triangle à ce niveau
  20. ll prevSize = (1LL << (level-1)) - 1; // Taille du triangle au niveau précédent
  21.  
  22. // Si le point est dans la partie inférieure
  23. if (x > prevSize) {
  24. // Vérifier si le point est dans le triangle bleu du milieu
  25. ll middleStart = prevSize + 1;
  26. ll offset = x - middleStart;
  27. if (y > offset && y <= offset + prevSize) {
  28. return false;
  29. }
  30.  
  31. // Ajuster les coordonnées pour les sous-triangles
  32. if (y <= offset) {
  33. // Triangle gauche
  34. x = x - prevSize;
  35. y = y;
  36. } else if (y > offset + prevSize) {
  37. // Triangle droit
  38. x = x - prevSize;
  39. y = y - (offset + prevSize);
  40. }
  41. }
  42.  
  43. level--;
  44. }
  45.  
  46. return true;
  47. }
  48.  
  49. int main() {
  50. ios_base::sync_with_stdio(false);
  51. cin.tie(nullptr);
  52.  
  53. int Q;
  54. cin >> Q;
  55.  
  56. while (Q--) {
  57. ll x, y;
  58. cin >> x >> y;
  59. cout << isRed(x, y) << '\n';
  60. }
  61.  
  62. return 0;
  63. }
Success #stdin #stdout 0.01s 5292KB
stdin
6
1 1
5 3
8 2
8 6
5 4
6 4
stdout
1
0
1
0
0
0