#!/usr/bin/python3 # Funkce na porovnání vzdálenosti def dist_squared(x1,y1,x2,y2): return (x1-x2)**2 + (y1-y2)**2 # Načtení vstupu N, K = [int(x) for x in input().split()] # Termity si uložíme jako dvojici (x, y), index termiti = [(tuple(map(int, input().split())), i) for i in range(N)] # Najdeme si velikost mapy min_x = min([x for (x, y), i in termiti]) min_y = min([y for (x, y), i in termiti]) max_x = max([x for (x, y), i in termiti]) max_y = max([y for (x, y), i in termiti]) size_x = max_x - min_x size_y = max_y - min_y # Nasypeme termity do přihrádek buckets = {} for (x, y), i in termiti: xx = (x - min_x) // K yy = (y - min_y) // K # Přihrádky indexujeme dvojicí souřadnic, abychom nemuseli vytvářet spoustu # prázdných přihrádek pro řídké vstupy if (xx, yy) not in buckets: buckets[(xx, yy)] = [] buckets[(xx, yy)].append(i) # Projdeme přihrádky a porovnáme všechny termity z blízkých přihrádek. # Každou přihrádku budeme porovnávat samu se sebou a pak s přihrádkami okolo. dvojice = [] smery = ((-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)) K_squared = K**2 dvojice = [] for (xx, yy), indexy in buckets.items(): for sx, sy in smery: # Zkontrolujeme, jestli sousední bucket existuje (pokud neexistuje, není zde žádný termit) if (xx+sx, yy+sy) in buckets: indexy2 = buckets[(xx+sx, yy+sy)] for a in indexy: (ax, ay), _ = termiti[a] for b in indexy2: (bx, by), _ = termiti[b] # Dvojici přidáme jen tehdy, pokud je index prvního termita menší, než # index druhého - to zabrání duplicitám if a < b and dist_squared(ax, ay, bx, by) <= K_squared: dvojice.append((a, b)) # Tisk výsledku for bod1, bod2 in dvojice: print(bod1, bod2)