// Generated by ChatGPT o1-preview (TLEを指摘ver) #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); for (int &x : A) cin >> x; if (M == 0) { // 全ての部分列が条件を満たす for (int k = 1; k <= N; ++k) { cout << N - k + 1 << "\n"; } return 0; } vector ans(N + 1, 0); vector count(M, 0); int total = 0; int left = 0; // 各長さの部分列の数をカウントするためのマップ map length_count; for (int right = 0; right < N; ++right) { if (A[right] < M) { if (count[A[right]] == 0) total++; count[A[right]]++; } while (total == M) { // 部分列の長さを計算 int len = right - left + 1; if (len <= N) { length_count[len]++; } if (A[left] < M) { count[A[left]]--; if (count[A[left]] == 0) total--; } left++; } } // 累積的にカウントを集計 for (auto &[len, cnt] : length_count) { ans[len] += cnt; } for (int k = 1; k <= N; ++k) { ans[k] += ans[k - 1]; cout << ans[k] << "\n"; } return 0; }