#include <iostream>
#include <vector>
#include <cstdint>
#include <climits>
#include <algorithm>
using namespace std;
int kthSmallestMine(vector<vector<int>>& matrix, int k) {
int lowest=INT_MAX, highest=INT_MIN;
for(vector<int> row: matrix) {
lowest=min(lowest, row[0]);
highest=max(highest, row[row.size()-1]);
}
while(lowest<highest) {
int mid=lowest+(highest-lowest+1)/2;
int places=0;
for(int i=0; i<matrix.size(); i++) {
places+=(upper_bound(matrix[i].begin(), matrix[i].end(), mid)-matrix[i].begin());
}
if(places<=k) lowest=mid; //this gives a number _not_ in the matrix (14)
else highest=mid-1;
// if(places<k) lowest=mid+1; //this gives a number _in_ the matrix (13)
// else highest=mid; //also use mid=lowest+(highest-lowest)/2 instead;
}
return lowest;
}
int kthSmallestTheirs(vector<vector<int>>& matrix, int k) {
int lowest=INT_MAX, highest=INT_MIN;
for(vector<int> row: matrix) {
lowest=min(lowest, row[0]);
highest=max(highest, row[row.size()-1]);
}
while(lowest<highest) {
int mid=lowest+(highest-lowest)/2;
int places=0;
for(int i=0; i<matrix.size(); i++) {
places+=(upper_bound(matrix[i].begin(), matrix[i].end(), mid)-matrix[i].begin());
}
if(places<k) lowest=mid+1; //this gives a number _in_ the matrix (13)
else highest=mid; //also use mid=lowest+(highest-lowest)/2 instead;
}
return lowest;
}
int main() {
vector<vector<int>> v={{1,100,1000}, {10, 150, 1500}, {30, 300, 3000}};
cout<<kthSmallestMine(v, 7)<<"\n";
cout<<kthSmallestTheirs(v, 7);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQga3RoU21hbGxlc3RNaW5lKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1hdHJpeCwgaW50IGspIHsKICAgIGludCBsb3dlc3Q9SU5UX01BWCwgaGlnaGVzdD1JTlRfTUlOOwogICAgZm9yKHZlY3RvcjxpbnQ+IHJvdzogbWF0cml4KSB7CiAgICAgICAgbG93ZXN0PW1pbihsb3dlc3QsIHJvd1swXSk7CiAgICAgICAgaGlnaGVzdD1tYXgoaGlnaGVzdCwgcm93W3Jvdy5zaXplKCktMV0pOwogICAgfQogICAgCiAgICB3aGlsZShsb3dlc3Q8aGlnaGVzdCkgewogICAgICAgIGludCBtaWQ9bG93ZXN0KyhoaWdoZXN0LWxvd2VzdCsxKS8yOwogICAgICAgIGludCBwbGFjZXM9MDsKICAgICAgICAKICAgICAgICBmb3IoaW50IGk9MDsgaTxtYXRyaXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgcGxhY2VzKz0odXBwZXJfYm91bmQobWF0cml4W2ldLmJlZ2luKCksIG1hdHJpeFtpXS5lbmQoKSwgbWlkKS1tYXRyaXhbaV0uYmVnaW4oKSk7CiAgICAgICAgfQogICAgICAgIGlmKHBsYWNlczw9aykgbG93ZXN0PW1pZDsgICAgICAvL3RoaXMgZ2l2ZXMgYSBudW1iZXIgX25vdF8gaW4gdGhlIG1hdHJpeCAoMTQpCiAgICAgICAgZWxzZSBoaWdoZXN0PW1pZC0xOwogICAgICAgIC8vIGlmKHBsYWNlczxrKSBsb3dlc3Q9bWlkKzE7ICAvL3RoaXMgZ2l2ZXMgYSBudW1iZXIgX2luXyB0aGUgbWF0cml4ICgxMykKICAgICAgICAvLyBlbHNlIGhpZ2hlc3Q9bWlkOyAgIC8vYWxzbyB1c2UgbWlkPWxvd2VzdCsoaGlnaGVzdC1sb3dlc3QpLzIgaW5zdGVhZDsKICAgIH0KICAgIAogICAgcmV0dXJuIGxvd2VzdDsKfQoKaW50IGt0aFNtYWxsZXN0VGhlaXJzKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1hdHJpeCwgaW50IGspIHsKICAgIGludCBsb3dlc3Q9SU5UX01BWCwgaGlnaGVzdD1JTlRfTUlOOwogICAgZm9yKHZlY3RvcjxpbnQ+IHJvdzogbWF0cml4KSB7CiAgICAgICAgbG93ZXN0PW1pbihsb3dlc3QsIHJvd1swXSk7CiAgICAgICAgaGlnaGVzdD1tYXgoaGlnaGVzdCwgcm93W3Jvdy5zaXplKCktMV0pOwogICAgfQogICAgCiAgICB3aGlsZShsb3dlc3Q8aGlnaGVzdCkgewogICAgICAgIGludCBtaWQ9bG93ZXN0KyhoaWdoZXN0LWxvd2VzdCkvMjsKICAgICAgICBpbnQgcGxhY2VzPTA7CiAgICAgICAgCiAgICAgICAgZm9yKGludCBpPTA7IGk8bWF0cml4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIHBsYWNlcys9KHVwcGVyX2JvdW5kKG1hdHJpeFtpXS5iZWdpbigpLCBtYXRyaXhbaV0uZW5kKCksIG1pZCktbWF0cml4W2ldLmJlZ2luKCkpOwogICAgICAgIH0KICAgICAgICBpZihwbGFjZXM8aykgbG93ZXN0PW1pZCsxOyAgLy90aGlzIGdpdmVzIGEgbnVtYmVyIF9pbl8gdGhlIG1hdHJpeCAoMTMpCiAgICAgICAgZWxzZSBoaWdoZXN0PW1pZDsgICAvL2Fsc28gdXNlIG1pZD1sb3dlc3QrKGhpZ2hlc3QtbG93ZXN0KS8yIGluc3RlYWQ7CiAgICB9CiAgICAKICAgIHJldHVybiBsb3dlc3Q7Cn0gICAKaW50IG1haW4oKSB7Cgl2ZWN0b3I8dmVjdG9yPGludD4+IHY9e3sxLDEwMCwxMDAwfSwgezEwLCAxNTAsIDE1MDB9LCB7MzAsIDMwMCwgMzAwMH19OwoJY291dDw8a3RoU21hbGxlc3RNaW5lKHYsIDcpPDwiXG4iOwoJY291dDw8a3RoU21hbGxlc3RUaGVpcnModiwgNyk7CgkKCXJldHVybiAwOwp9