895 vector<vector<int>> a(n + 1, vector<int>(m + 1, 0));
896 unordered_set<int> filled_rows = unordered_set<int>();
897 unordered_set<int> filled_cols = unordered_set<int>();
898 vector<int> row_cnt = vector<int>(n + 1, 0);
899 vector<int> col_cnt = vector<int>(m + 1, 0);
900 for(
int i = 1; i <= n; i++) {
901 for(
int j = 1; j <= m; j++) {
909 for(
int i = 1; i <= n; i++) {
910 for(
int j = 1; j <= m; j++) {
911 if(row_cnt[i] == n) {
912 filled_rows.insert(i);
914 if(col_cnt[j] == m) {
915 filled_cols.insert(j);
919 vector<vector<int>> a_cpy(a.begin(), a.end());
920 queue<pair<bool, int>> q = queue<pair<bool, int>>();
921 for(
int i = 1; i < n; i++) {
923 filled_rows.insert(i);
924 q.push(make_pair(
true, i));
927 for(
int i = 1; i < m; i++) {
929 filled_cols.insert(i);
930 q.push(make_pair(
false, i));
934 auto [is_row, index] = q.front();
939 for(
int j = 1; j <= m; j++) {
940 if(a[index][j] > 0) {
950 int d = (a[index][r] - a[index][l]) / (r - l);
951 for(
int j = 1; j <= m; j++) {
952 if(a[index][j] == 0) {
953 a[index][j] = a[index][l] + (j - l) * d;
955 if(col_cnt[j] > 1 && filled_cols.find(j) == filled_cols.end()) {
956 filled_cols.insert(j);
964 for(
int i = 1; i <= n; i++) {
965 if(a[i][index] > 0) {
975 int d = (a[r][index] - a[l][index]) / (r - l);
976 for(
int i = 1; i <= n; i++) {
977 if(a[i][index] == 0) {
978 a[i][index] = a[l][index] + (i - l) * d;
980 if(row_cnt[i] > 1 && filled_rows.find(i) == filled_rows.end()) {
981 filled_rows.insert(i);
988 for(
int i = 1; i <= n; i++) {
989 for(
int j = 1; j <= m; j++) {
990 if(a_cpy[i][j] != a[i][j]) {
991 cout << i <<
' ' << j <<
' ' << a[i][j] << endl;