// Generated by ChatGPT o1-preview #include #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector A(N + 1); for (int i = 1; i <= N; ++i) { cin >> A[i]; } vector last_occurrence(M, 0); // 0-based indexing vector len(N + 1, 0); int l_i = 0; for (int i = 1; i <= N; ++i) { if (A[i] < M) { last_occurrence[A[i]] = i; } int max_last = 0; bool all_present = true; for (int j = 0; j < M; ++j) { if (last_occurrence[j] == 0) { all_present = false; break; } max_last = max(max_last, last_occurrence[j]); } if (all_present) { l_i = max_last; len[i] = i - l_i + 1; } else { len[i] = 0; // Cannot form a valid subarray ending at i } } vector cnt(N + 2, 0); // cnt[k] for (int i = 1; i <= N; ++i) { if (len[i] > 0) { int k = min(len[i], i); cnt[k]++; } } vector ans(N + 2, 0); for (int k = N; k >= 1; --k) { ans[k] = ans[k + 1] + cnt[k]; } for (int k = 1; k <= N; ++k) { cout << ans[k] << "\n"; } return 0; }