#include #include #define MAXL 500 // Velikost lesa #define MAXS 100000 // Max. #stromů int D; // Průměr legie int S; // Počet stromů int map[MAXL][MAXL]; // Mapa lesa: 0=volno, 1=strom int lastx[MAXL]; // Sloupec nejpravějšího stromu v řádku int lastc[MAXL]; // Komponenta nejpravějšího stromu v řádku int uf[MAXL*MAXL+100]; // Union-Find: Ukazatel na otce int rank[MAXL*MAXL+100]; // Union-Find: Rank stromu int nc; // Počet komponent int sqr(int x) { return x*x; } // Založí novou komponentu int newc(void) { uf[nc] = nc; rank[nc] = 0; return nc++; } // Zjistí, do jaké komponenty padá daný vrchol int find(int x) { while (uf[x] != x) x = uf[x]; return x; } // Spojí dvě komponenty do jedné (union je klíčové slovo :)) int onion(int xc, int yc) { if (rank[xc] < rank[yc]) { int t = xc; xc = yc; yc = t; } uf[yc] = xc; if (rank[xc] == rank[yc]) rank[xc]++; return xc; } // Zametání int search(void) { for (int i=0; i MAXL-D) c = rc; else c = newc(); int min = y - D + 1; if (min < 0) min = 0; int max = y + D - 1; if (max >= MAXL) max = MAXL-1; for (int yy=min; yy<=max; yy++) { int xx = lastx[yy]; if (xx >= 0 && sqr(xx-x) + sqr(yy-y) < D*D) c = onion(find(c), find(lastc[yy])); } lastc[y] = c; } lastx[y] = x; } if (find(lc) == find(rc)) return 0; else return 1; } int main(void) { scanf("%d", &D); int nt; scanf("%d", &nt); for (int i=0; i