#include #define MAX_R 1000 #define MAX_S 1000 int R, S; int B[MAX_R][MAX_S]; int row_sum[MAX_R][MAX_S], col_sum[MAX_R][MAX_S]; int winning[MAX_R][MAX_S]; int main(void) { scanf("%d%d", &R, &S); // Procházíme postupně všechny pozice (i, j) po řádcích. for (int i = 0; i < R; ++i) for (int j = 0; j < S; ++j) { scanf("%d", &B[i][j]); // Přepočítáme součty posledního řádku, resp. posledního sloupce. // Uchováváme pouze zbytek součtu po dělení dvěma. if (i == 0) col_sum[i][j] = B[i][j] % 2; else col_sum[i][j] = (B[i][j] + col_sum[i - 1][j]) % 2; if (j == 0) row_sum[i][j] = B[i][j] % 2; else row_sum[i][j] = (B[i][j] + row_sum[i][j - 1]) % 2; // Vyhodnotíme, zda je aktuální pozice vyhrávající pro hráče, // který je aktuálně na tahu. Stav je vyhrávající, pokud z něj // existuje povolený tah, který vede do prohrávajícího pozice. winning[i][j] = 0; if (row_sum[i][j] == 0 && (i == 0 || winning[i - 1][j] == 0)) { winning[i][j] = 1; } if (col_sum[i][j] == 0 && (j == 0 || winning[i][j - 1] == 0)) { winning[i][j] = 1; } } // Bobek s Bobkem vyhrají, pokud je (R, S) vyhrávající pozice if (winning[R - 1][S - 1]) printf("B\n"); else printf("S\n"); return 0; }