#include using namespace std; #define rep(i,a,b) for(int i=a;i class SegTreeMax { public: static V const def = -(1LL << 60); V comp(V l, V r) { return max(l, r); }; vector val; SegTreeMax() { val = vector(NV * 2, def); } V getval(int l, int r) { //[l,r] l += NV; r += NV + 1; V ret = def; while (l < r) { if (l & 1) ret = comp(ret, val[l++]); if (r & 1) ret = comp(ret, val[--r]); l /= 2; r /= 2; } return ret; } void update(int i, V v) { i += NV; val[i] = v; while (i>1) i >>= 1, val[i] = comp(val[i * 2], val[i * 2 + 1]); } }; template class SegTreeMin { public: static V const def = (1LL << 31) - 1; V comp(V l, V r) { return min(l, r); }; vector val; SegTreeMin() { val = vector(NV * 2, def); } V getval(int l, int r) { //[l,r] l += NV; r += NV + 1; V ret = def; while (l < r) { if (l & 1) ret = comp(ret, val[l++]); if (r & 1) ret = comp(ret, val[--r]); l /= 2; r /= 2; } return ret; } void update(int i, V v) { i += NV; val[i] = v; while (i>1) i >>= 1, val[i] = comp(val[i * 2], val[i * 2 + 1]); } }; //----------------------------------------------------------------- int N, M; int E[3][800]; //----------------------------------------------------------------- double calc(int m) { SegTreeMax st_max; SegTreeMin st_min; rep(i, 0, N) st_max.update(i, E[m][i]); rep(i, 0, N) st_min.update(i, E[m][i]); int cnt[805]; rep(i, 0, N + 1) cnt[i] = 0; rep(i, 0, N) rep(j, i + 1, N) { int _max = max(E[m][i], E[m][j]); int _min = min(E[m][i], E[m][j]); int idx = 0; if (j != N - 1) { if (E[m][i] < E[m][j]) { int _min_st = st_min.getval(j + 1, N - 1); if (_min_st < E[m][j]) idx = max(idx, E[m][j]); } else { int _max_st = st_max.getval(j + 1, N - 1); if (E[m][j] < _max_st) idx = max(idx, max(E[m][i], _max_st)); } } if (i != 0) { if (E[m][i] < E[m][j]) { int _max_st = st_max.getval(0, i - 1); if (E[m][i] < _max_st) idx = max(idx, max(E[m][j], _max_st)); } else { int _min_st = st_min.getval(0, i - 1); if (_min_st < E[m][i]) idx = max(idx, E[m][i]); } } if (j - i != 1) { int _max_st = st_max.getval(i + 1, j - 1); int _min_st = st_max.getval(i + 1, j - 1); if (_max < _max_st) idx = max(idx, _max_st); if (_min_st < _min) idx = max(idx, _max); } cnt[idx]++; } int sum = 0; rep(i, 0, N + 1) sum += cnt[i]; double ret = 0; rep(i, 0, N + 1) ret += (double)i * ((double)cnt[i] / (double)sum); return ret; } //----------------------------------------------------------------- int main() { scanf("%d %d", &N, &M); rep(i, 0, M) rep(j, 0, N) scanf("%d", &E[i][j]); int ans = 0; double ans_p = -1; rep(i, 0, M) { float p = calc(i); if (ans_p < p) { ans = i; ans_p = p; } } printf("%d\n", ans); }