//Code by Patcas Csaba #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define PII pair #define VB vector #define VI vector #define VD vector #define VS vector #define VPII vector > #define VVI vector < VI > #define VVB vector < VB > #define FORN(i, n) for(int i = 0; i < (n); ++i) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define FORI(it, X) for(__typeof((X).begin()) it = (X).begin(); it !=(X).end(); ++it) #define REPEAT do{ #define UNTIL(x) }while(!(x)); #define SZ size() #define BG begin() #define EN end() #define CL clear() #define X first #define Y second #define RS resize #define PB push_back #define MP make_pair #define ALL(x) x.begin(), x.end() #define IN_FILE "a.in" #define OUT_FILE "a.out" int n, k; VS names; VVI a; vector b; VI par; VB was; bool found; void df(int node) { if (was[node]) return; was[node] = true; if (node <= k) { FOR(i, 1, n) if (b[i][node] && par[i + k] == 0) { df(i + k); if (found) { par[node] = i + k; par[i + k] = node; return; } } FOR(i, 1, n) if (b[i][node]) { df(i + k); if (found) { par[node] = i + k; par[i + k] = node; return; } } } else { if (par[node] == 0) { found = true; return; } df(par[node]); } } int main() { //Read data //freopen(IN_FILE, "r", stdin); //freopen(OUT_FILE, "w", stdout); cin >> n >> k; names.RS(n + 1); a.RS(n + 1, VI(k + 1)); FOR(i, 1, n) { cin >> names[i]; FOR(j, 1, k) cin >> a[i][j]; } //Solve b.RS(n + 1, VB(k + 1)); FOR(i, 1, n) FOR(j, 3, k) if (a[i][j] > a[i][j - 1] && a[i][j - 1] > a[i][j - 2]) b[i][j] = true; par.RS(k + n + 1); was.RS(k + n + 1); //Write data FOR(i, 1, k) if (par[i] == 0) { found = false; fill(ALL(was), false); df(i); } FOR(i, 1, k) if (par[i] == 0) cout << "none" << endl; else cout << names[par[i] - k] << endl; return 0; }