이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
class segment_tree{
public:
vector<int> tree;
int N;
segment_tree(int K){
	N = 1;
	while(K >= N){
		N *= 2;
	}
	tree.assign(N * 2, 0);
}
void update(int head, int l, int r, int pos, int val){
	if(r - l == 1){
		tree[head] += val;
		return;
	}
	int mid = (l + r) / 2;
	if(pos < mid){
		update(head * 2 + 1, l, mid, pos, val);
	}
	else{
		update(head *2 + 2, mid, r, pos, val);
	}
	tree[head] = max(tree[head * 2 + 2], tree[head * 2 + 1]); 
}
void update(int pos, int val){
	update(0, 0, N, pos, val);
}
};
int main(){
	int N, M;
	cin >> N >> M;
	vector<int> arr(N);
	for(int i = 0; i < N; i ++){
		cin >> arr[i];
		arr[i]--;
	}
	vector<vector<vector<int>>> brr(M + 5, vector<vector<int>>(2));
	segment_tree tree(M + 5);
	vector<int> counts(M + 5);
	for(int i = 0; i < N; i ++){
		for(int j = 0; j < 2; j ++){
			int pi = i + 1 - (i + j) % 2 * 2;
			if(pi > -1 && pi < N && arr[pi] != arr[i]){
				brr[arr[i]][j].push_back(arr[pi]);
			}
		}
		counts[arr[i]] ++;
		tree.update(arr[i], 1);
	}
	for(int i = 0; i < M; i ++){
		tree.update(i, -counts[i]);
		int ans = N;
		for(int j = 0; j < 2; j ++){
			for(int k : brr[i][j])tree.update(k, -1);
			ans = min(ans, N-tree.tree[0]-counts[i]);
			for(int k : brr[i][j])tree.update(k, 1);
		}
		tree.update(i, counts[i]);
		cout << ans << endl;
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |