#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Data structure to store value and its original sequence index
struct Element {
int val;
int id;
// Comparison function to sort in ascending order of value
bool operator<(const Element& other) const {
return val < other.val;
}
};
int main() {
// Optimize I/O in C++
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<Element> a;
a.reserve(n * m);
// Read input data
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
int v;
cin >> v;
a.push_back({v, i});
}
}
// Step 1: Sort all elements in ascending order by value
sort(a.begin(), a.end());
// Step 2: Two Pointers Technique (Sliding Window)
vector<int> freq(n + 1, 0);
int unique_count = 0;
int ans = 2e9 + 7; // Initialize answer with a very large value
int total_elements = n * m;
int L = 0;
for (int R = 0; R < total_elements; ++R) {
// Expand the window to the right (Pointer R)
if (freq[a[R].id] == 0) {
unique_count++;
}
freq[a[R].id]++;
// Shrink the window from the left (Pointer L) when all N sequences are present
while (unique_count == n) {
ans = min(ans, a[R].val - a[L].val);
freq[a[L].id]--;
if (freq[a[L].id] == 0) {
unique_count--;
}
L++; // Move left pointer
}
}
// Step 3: Print result
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIERhdGEgc3RydWN0dXJlIHRvIHN0b3JlIHZhbHVlIGFuZCBpdHMgb3JpZ2luYWwgc2VxdWVuY2UgaW5kZXgKc3RydWN0IEVsZW1lbnQgewogICAgaW50IHZhbDsKICAgIGludCBpZDsKCiAgICAvLyBDb21wYXJpc29uIGZ1bmN0aW9uIHRvIHNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHZhbHVlCiAgICBib29sIG9wZXJhdG9yPChjb25zdCBFbGVtZW50JiBvdGhlcikgY29uc3QgewogICAgICAgIHJldHVybiB2YWwgPCBvdGhlci52YWw7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIC8vIE9wdGltaXplIEkvTyBpbiBDKysKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKCiAgICBpbnQgbiwgbTsKICAgIGlmICghKGNpbiA+PiBuID4+IG0pKSByZXR1cm4gMDsKCiAgICB2ZWN0b3I8RWxlbWVudD4gYTsKICAgIGEucmVzZXJ2ZShuICogbSk7CgogICAgLy8gUmVhZCBpbnB1dCBkYXRhCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBtOyArK2opIHsKICAgICAgICAgICAgaW50IHY7CiAgICAgICAgICAgIGNpbiA+PiB2OwogICAgICAgICAgICBhLnB1c2hfYmFjayh7diwgaX0pOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBTdGVwIDE6IFNvcnQgYWxsIGVsZW1lbnRzIGluIGFzY2VuZGluZyBvcmRlciBieSB2YWx1ZQogICAgc29ydChhLmJlZ2luKCksIGEuZW5kKCkpOwoKICAgIC8vIFN0ZXAgMjogVHdvIFBvaW50ZXJzIFRlY2huaXF1ZSAoU2xpZGluZyBXaW5kb3cpCiAgICB2ZWN0b3I8aW50PiBmcmVxKG4gKyAxLCAwKTsKICAgIGludCB1bmlxdWVfY291bnQgPSAwOwogICAgaW50IGFucyA9IDJlOSArIDc7IC8vIEluaXRpYWxpemUgYW5zd2VyIHdpdGggYSB2ZXJ5IGxhcmdlIHZhbHVlCiAgICBpbnQgdG90YWxfZWxlbWVudHMgPSBuICogbTsKCiAgICBpbnQgTCA9IDA7CiAgICBmb3IgKGludCBSID0gMDsgUiA8IHRvdGFsX2VsZW1lbnRzOyArK1IpIHsKICAgICAgICAvLyBFeHBhbmQgdGhlIHdpbmRvdyB0byB0aGUgcmlnaHQgKFBvaW50ZXIgUikKICAgICAgICBpZiAoZnJlcVthW1JdLmlkXSA9PSAwKSB7CiAgICAgICAgICAgIHVuaXF1ZV9jb3VudCsrOwogICAgICAgIH0KICAgICAgICBmcmVxW2FbUl0uaWRdKys7CgogICAgICAgIC8vIFNocmluayB0aGUgd2luZG93IGZyb20gdGhlIGxlZnQgKFBvaW50ZXIgTCkgd2hlbiBhbGwgTiBzZXF1ZW5jZXMgYXJlIHByZXNlbnQKICAgICAgICB3aGlsZSAodW5pcXVlX2NvdW50ID09IG4pIHsKICAgICAgICAgICAgYW5zID0gbWluKGFucywgYVtSXS52YWwgLSBhW0xdLnZhbCk7CgogICAgICAgICAgICBmcmVxW2FbTF0uaWRdLS07CiAgICAgICAgICAgIGlmIChmcmVxW2FbTF0uaWRdID09IDApIHsKICAgICAgICAgICAgICAgIHVuaXF1ZV9jb3VudC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEwrKzsgLy8gTW92ZSBsZWZ0IHBvaW50ZXIKICAgICAgICB9CiAgICB9CgogICAgLy8gU3RlcCAzOiBQcmludCByZXN1bHQKICAgIGNvdXQgPDwgYW5zIDw8ICJcbiI7CgogICAgcmV0dXJuIDA7Cn0=