// checking to make sure taking a step each call will TLE #include using namespace std; const int MAXN = 210000; int pos[MAXN]; bool done[MAXN]; int dir[MAXN]; int D[MAXN]; int nsafe[MAXN]; int main() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); int N, M, L; cin >> N >> M >> L; vector> s(N); for (auto& v : s) { v.resize(11); for (int& x : v) cin >> x; } while (M--) { int h; cin >> h; if (h < 12) { for (int i = 0; i < N; ++i) pos[i] = min(L, pos[i] + h*s[i][h-1]); } else { for (int i = 0; i < N; ++i) if (pos[i] < L-pos[i]) { dir[i] = -1; D[i] = pos[i]; } else { dir[i] = 1; D[i] = L-pos[i]; } int catch_s = -1, catch_d; for (int i = 0; i < N; ++i) if (L < 4*D[i] && !done[i]) { if (catch_s == -1 || (catch_d == -1 && dir[i] == 1)) { catch_s = i; catch_d = dir[i]; } } int nn = 0; for (int i = 0; i < N; ++i) if (!done[i] && i != catch_s && dir[i] == 1) nsafe[nn++] = i; // for (int i = 0; i < N; ++i) cout << D[i] << ' ' << dir[i] << ' '; cout << endl; if (nn == 0) cout << "None\n"; else for (int i = 0; i < nn; ++i) { done[nsafe[i]] = true; cout << nsafe[i]+1 << (i+1==nn?'\n':' '); } if (catch_s == -1) cout << "None\n"; else { done[catch_s] = true; cout << catch_s+1 << '\n'; } memset(pos, 0, sizeof(pos)); } } return 0; }