boolcheck(int value, int n, int m, pair<int, int> &ans){ map<unsigned, int> s; for (int i = 0; i < n; ++i) { unsigned temp = 0; for (int j = 0; j < m; ++j) { temp <<= 1u; temp |= data[i][j] > value; } s.insert({temp, i}); } unsigned tar = -1u >> (sizeof(int) * 8 - m); for (auto iter1 = s.begin(); iter1 != s.end(); ++iter1) { for (auto iter2 = iter1; iter2 != s.end(); ++iter2) { if ((iter1->first | iter2->first) == tar) { ans.first = iter1->second; ans.second = iter2->second; returntrue; } } } returnfalse; }
voidsolve(){ int n, m; cin >> n >> m; int l = INT_MAX, r = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> data[i][j]; l = min(l, data[i][j]); r = max(r, data[i][j]); } } int mid, cnt = r - l; pair<int, int> ans; while (cnt > 0) { int step = cnt / 2; mid = l + step; if (check(mid, n, m, ans)) { l = mid + 1; cnt -= step + 1; } else cnt /= 2; } cout << ans.first + 1 << " " << ans.second + 1 << endl; }