#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template istream& operator >> (istream& is, vector& vec){for(T& val: vec) is >> val; return is;} template istream& operator , (istream& is, T& val){ return is >> val;} template ostream& operator << (ostream& os, vector& vec){for(int i=0; i ostream& operator , (ostream& os, T& val){ return os << " " << val;} template ostream& operator >> (ostream& os, T& val){ return os << " " << val;} bool is_kadomatsu_sequence(vector x){ if(x.size() != 3) return false; if(x[0] < x[1] && x[1] > x[2] && x[2] != x[0]) return true; if(x[0] > x[1] && x[1] < x[2] && x[2] != x[0]) return true; return false; } //segment tree //using std::function as comparing function template class SegmentTree{ int n; vector V; Value DEFAULT_VALUE; //evaluation function static Value default_evaluate(Value a, Value b){ return max(a,b); } function< Value(Value, Value) > evaluate; //return evaluated value in [a,b) //T[at] covers [l,r) Value RangeEvaluation(int a, int b, int at, int l, int r){ //out of range if(r <= a || b <= l) return DEFAULT_VALUE; //covered if(a <= l && r <= b) return V[at]; //partially covered else{ Value val_left = RangeEvaluation(a,b, at*2+1, l, (l+r)/2); Value val_right = RangeEvaluation(a,b, at*2+2, (l+r)/2, r); return evaluate(val_left, val_right); } } public: SegmentTree(int size, Value DEFAULT , function< Value(Value, Value) > eval /*= default_evaluate*/){ DEFAULT_VALUE = DEFAULT; evaluate = eval; n=1; while(n(2*n - 1, DEFAULT_VALUE); } void update(int at, Value new_val){ at += n-1; V[at] = new_val; while(at>0){ at = (at-1)/2; V[at] = evaluate(V[at*2 + 1], V[at*2 + 2]); } } //return evaluated value in [l,r) Value RangeEvaluation(int l, int r){ if(l>=r) return DEFAULT_VALUE; if(l>=n) return DEFAULT_VALUE; return RangeEvaluation(l,r, 0, 0, n); } }; int main(){ int n,m; cin >> n,m; vector> a(m, vector(n)); cin >> a; function my_min = [&](int l, int r){return min(l,r);}; function my_max = [&](int l, int r){return max(l,r);}; long long max_ = 0; double p = 1.0 / (n * (n-1) * 0.5); int val = 0; for(int i=0; i seg_min(n, 2000, my_min); SegmentTree seg_max(n, -1, my_max); for(int j=0; j l < r if(x>0){ int z = seg_max.RangeEvaluation(0,x); if(z > l){ int hoge = max(z, r); if(ans r if(x>0){ int z = seg_min.RangeEvaluation(0,x); if(z < l){ int hoge = l; if(ans 1){ // l < z > r int z = seg_max.RangeEvaluation(l+1, r); if(z > max(l,r)){ int hoge = z; if(ans z < r z = seg_min.RangeEvaluation(l+1, r); if(z < min(l,r)){ int hoge = max(l,r); if(ans z if(n-r > 1){ int z = seg_min.RangeEvaluation(r+1, n); if(z < r){ int hoge = r; if(ans r < z if(n-r > 1){ int z = seg_max.RangeEvaluation(r+1, n); if(z > r){ int hoge = max(l,z); if(ans