본문 바로가기

알고리즘/알고리즘 이론, 템플릿

머지소트트리

int arr[100002];
vector<int> tree[4 * 100002];
int N, M, K;

void update(int bucket, int start, int end, int node,  int x) {
	if (node < start || end < node) return;

	tree[bucket].push_back(x);

	if (start != end) 
	{
		update(bucket * 2, start, (start + end) / 2, node, x);
		update(bucket * 2 + 1, (start + end) / 2 + 1, end,  node,  x);
	}
}

int query(int node, int start, int end, int left, int right, int x) {
	if (left > end || right < start) 
		return 0;
	if (left <= start && end <= right) 
		return tree[node].end() - upper_bound(tree[node].begin(), tree[node].end(), x);

	int mid = (start + end) >> 1;

	return query(node * 2, start, mid, left, right, x) + query(node * 2 + 1, mid + 1, end, left, right, x);
}


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;

	rep1(i, N)
	{
		int tmp;
		cin >> tmp;
		update(1, 1, N, i, tmp);
	}

	rep(i, 4 * 100002)
	{
		sort(tree[i].begin(), tree[i].end());
	}

	cin >> M;
	rep(i, M) 
	{
		int a, b, c;

		cin >> a >> b >> c;
		cout << query(1, 1, N, a, b, c)<<'\n';
	}


	return 0;
}

 

간단히 보자면 기존의 세그같은 느낌인데 리프 노드에서 올라갈수록 수열이 합쳐지는 세그트리 신기한듯

'알고리즘 > 알고리즘 이론, 템플릿' 카테고리의 다른 글

mcmf  (0) 2024.03.07
네트워크 플로우  (0) 2024.03.07
LCA , sparsetable  (0) 2023.12.11
다익스트라  (0) 2023.10.26
포함배제원리와 뫼비우스함수  (0) 2023.09.20