[C++] ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)

2020. 11. 21. 18:00ยท๐Ÿ“ Computer Science/โœ Algorithm

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)

๋ฐฐ์—ด ๋‚ด ๋ฒ”์œ„ ๊ฐ’์„ ๊ตฌํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๋ฒ”์œ„์˜ ๊ฐ’๋“ค์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ตฌ๊ฐ„๋“ค์„ ๋ณด์กดํ•˜๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ์ด๋‹ค.

  • ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ๋ฐฐ์—ด์˜ ๊ทธ ์ˆ˜ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ณ  ๋ฆฌํ”„ ๋…ธ๋“œ ์™ธ ๋…ธ๋“œ๋“ค์€ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ฐ’์ด๋‹ค.
  • ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋…ธ๋“œ๋Š” ๋น„์›Œ์ ธ์žˆ๋Š”๋ฐ, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ฑ„์›Œ์•ผํ•œ๋‹ค.

 

arr = [5, 2, 3, 6, 7, 8, 1, 11]

 

๊ธฐ๋ณธ ์›๋ฆฌ : ํ•ฉ

 

https://www.acmicpc.net/blog/view/9

 

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ (Segment Tree)

๋ฌธ์ œ ๋ฐฐ์—ด A๊ฐ€ ์žˆ๊ณ , ์—ฌ๊ธฐ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ๊ตฌ๊ฐ„ l, r (l ≤ r)์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, A[l] + A[l+1] + ... + A[r-1] + A[r]์„ ๊ตฌํ•ด์„œ ์ถœ๋ ฅํ•˜๊ธฐ i๋ฒˆ์งธ ์ˆ˜๋ฅผ v๋กœ ๋ฐ”๊พธ๊ธฐ. A[i

www.acmicpc.net

 

1) ์ดˆ๊ธฐํ™” : ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

// a: ๋ฐฐ์—ด a
// tree: ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ
// node: ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋…ธ๋“œ ๋ฒˆํ˜ธ
// node๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ํ•ฉ์˜ ๋ฒ”์œ„๊ฐ€ start ~ end
long long init(vector<long long>& a, vector<long long>& tree, int node, int start, int end)
{
    // ๋ฆฌํ”„ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
    if (start == end)
        return tree[node] = a[start];

    int mid = (start + end) / 2;
    return tree[node] = init(a, tree, node * 2, start, mid) + init(a, tree, node * 2 + 1, mid + 1, end);
}

 

2) ์ฟผ๋ฆฌ : ๊ตฌ๊ฐ„ ๊ฒ€์ƒ‰

// node๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌ๊ฐ„์ด start ~ end ์ด๊ณ , ๊ตฌํ•ด์•ผํ•˜๋Š” ํ•ฉ์˜ ๋ฒ”์œ„๋Š” left ~ right ์ด๋‹ค.
long long query(vector<long long>& tree, int node, int start, int end, int left, int right)
{
    // 1. ์ž์‹ ๋…ธ๋“œ ๋‘˜ ๋‹ค ๋ฒ”์œ„ ๋ฐ–์ผ ๊ฒฝ์šฐ
    if (left > end || right < start)
        return 0;

    // 2. ์ž์‹ ๋…ธ๋“œ ๋‘˜ ๋‹ค ๋ฒ”์œ„ ์•ˆ์— ์žˆ์„ ๊ฒฝ์šฐ   
    if (left <= start && end <= right)
        return tree[node];

    // 3. ์ž์‹ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ฒ”์œ„ ์•ˆ์— ์žˆ์„ ๊ฒฝ์šฐ
    int mid = (start + end) / 2;
    return query(tree, node * 2, start, mid, left, right) + query(tree, node * 2 + 1, mid + 1, end, left, right);
}

 

3) ์ˆ˜ ๋ณ€๊ฒฝํ•˜๊ธฐ

long long update(vector<long long>& tree, int node, int start, int end, int index, long long value)
{
    // 1. start ~ end์— index๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    if (index < start || index > end)
        return tree[node];

    // 2. start ~ end์— index๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ ์ค‘ ๋ฆฌํ”„ ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
    if (start == end)
        return tree[node] += value;

    // 3. start ~ end์— index๊ฐ€ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ ์ค‘ ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ
    int mid = (start + end) / 2;
    return tree[node] = update(tree, node * 2, start, mid, index, value) + update(tree, node * 2 + 1, mid + 1, end, index, value);
}

 

๋ฌธ์ œ : ํ•ฉ

 

https://www.acmicpc.net/problem/3653

 

3653๋ฒˆ: ์˜ํ™” ์ˆ˜์ง‘

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ํ•œ ์ค„์— m๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. i๋ฒˆ์งธ ์ถœ๋ ฅํ•˜๋Š” ์ˆ˜๋Š” i๋ฒˆ์งธ๋กœ ์˜ํ™”๋ฅผ ๋ณผ ๋•Œ ๊ทธ ์˜ํ™”์˜ ์œ„์— ์žˆ์—ˆ๋˜ DVD์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ๋งค๋ฒˆ ์˜ํ™”๋ฅผ ๋ณผ ๋•Œ๋งˆ๋‹ค ๋ณธ ์˜ํ™” DVD

www.acmicpc.net

#include <iostream>
#include <vector>
using namespace std;

#define SIZE 200000 // n+m

int n, m;
vector<int> tree, idx;

int init(int node, int start, int end, int left, int right)
{
    if (left > end || right < start)
        return 0;
    if (start == end)
        return tree[node] = 1;
    int mid = (start + end) / 2;
    return tree[node] = init(node * 2, start, mid, left, right) + init(node * 2 + 1, mid + 1, end, left, right);
}

int query(int node, int start, int end, int left, int right)
{
    if (left > end || right < start)
        return 0;
    if (left <= start && end <= right)
        return tree[node];
    int mid = (start + end) / 2;
    return query(node * 2, start, mid, left, right) + query(node * 2 + 1, mid + 1, end, left, right);
}

int update(int node, int start, int end, int index, int value)
{
    if (index > end || index < start)
        return tree[node];
    if (start == end)
        return tree[node] += value;
    int mid = (start + end) / 2;
    return tree[node] = update(node * 2, start, mid, index, value) + update(node * 2 + 1, mid + 1, end, index, value);
}

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

    int t;
    cin >> t;
    while (t--) {
        tree.clear();
        tree.resize(4 * SIZE + 1);
        idx.clear();
        idx.resize(SIZE / 2 + 1);

        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            idx[i] = m + i;

        init(1, 1, m + n, m + 1, m + n);

        for (int i = 0; i < m; i++) {
            int num;
            cin >> num;
            cout << query(1, 1, m + n, 1, idx[num] - 1) << " ";

            update(1, 1, m + n, idx[num], -1); // ํ•ด๋‹น ๋””๋น„๋””๋ฅผ ๊บผ๋‚ด๊ณ  ์—…๋ฐ์ดํŠธ
            idx[num] = m - i;
            update(1, 1, m + n, idx[num], 1); // ํ•ด๋‹น ๋””๋น„๋””๋ฅผ ๋งจ ์œ„์— ๋„ฃ๊ณ  ์—…๋ฐ์ดํŠธ
        }

        cout << '\n';
    }
}

 

๋ฌธ์ œ : ๊ณฑ

 

https://www.acmicpc.net/problem/5676

 

5676๋ฒˆ: ์Œ์ฃผ ์ฝ”๋”ฉ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๊ณฑ์…ˆ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ์ค„์— ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ์ถœ๋ ฅํ•˜๋Š” i๋ฒˆ์งธ ๋ฌธ์ž๋Š” i๋ฒˆ์งธ ๊ณฑ์…ˆ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ์ด๋‹ค. ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” +, ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” -, ์˜์ธ ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

#include <iostream>
using namespace std;

int tree[400004], arr[100001];

int init(int node, int start, int end)
{
	if (start == end)
		return tree[node] = arr[start];
	int mid = (start + end) / 2;
	return tree[node] = init(node * 2, start, mid) * init(node * 2 + 1, mid + 1, end);
}

int query(int node, int start, int end, int left, int right)
{
	if (left > end || right < start)
		return 1;
	if (left <= start && end <= right)
		return tree[node];
	int mid = (start + end) / 2;
	return query(node * 2, start, mid, left, right) * query(node * 2 + 1, mid + 1, end, left, right);
}

int update(int node, int start, int end, int index, int diff)
{
	if (index < start || index > end)
		return tree[node];
	if (start == end)
		return tree[node] = diff;
	int mid = (start + end) / 2;
	return tree[node] = update(node * 2, start, mid, index, diff) * update(node * 2 + 1, mid + 1, end, index, diff);
}

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

	int N, K;
	while (cin >> N >> K) {
		for (int i = 1; i <= N; i++) {
			cin >> arr[i];
			if (arr[i] > 0)
				arr[i] = 1;
			else if (arr[i] < 0)
				arr[i] = -1;
		}

		init(1, 1, N);

		while (K--) {
			char c;
			int i, j;
			cin >> c >> i >> j;

			if (c == 'C') {
				if (j > 0)
					j = 1;
				else if (j < 0)
					j = -1;

				update(1, 1, N, i, j);
				arr[i] = j;
			}
			else if (c == 'P') {
				int answer = query(1, 1, N, i, j);
				if (answer == 0)
					cout << 0;
				else if (answer > 0)
					cout << '+';
				else
					cout << '-';
			}
		}
		cout << '\n';
	}
}

 

๋ฌธ์ œ : ์ตœ์†Ÿ๊ฐ’

 

https://www.acmicpc.net/problem/2336

 

2336๋ฒˆ: ๊ต‰์žฅํ•œ ํ•™์ƒ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์„ธ ๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์‹œํ—˜์—์„œ 1๋“ฑ์ธ ํ•™์ƒ๋ถ€ํ„ฐ N๋“ฑ์ธ ํ•™์ƒ์ด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ํ•™์ƒ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.

www.acmicpc.net

#include <iostream>
#include <algorithm>
using namespace std;

int scores[3][500001], tree[500001 * 4];
pair<int, int> firstTest[500001];

int query(int node, int start, int end, int left, int right)
{
    if (left > end || right < start)
        return 1e9;
    if (left <= start && end <= right)
        return tree[node];
    int mid = (start + end) / 2;
    return min(query(node * 2, start, mid, left, right), query(node * 2 + 1, mid + 1, end, left, right));
}

int update(int node, int start, int end, int index, int value) 
{
    if (index < start || index > end)
        return tree[node];
    if (start == end)
        return tree[node] = value;
    int mid = (start + end) / 2;
    return tree[node] = min(update(node * 2, start, mid, index, value), update(node * 2 + 1, mid + 1, end, index, value));
}

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

    int n;
    cin >> n;
    for (int i = 0; i < 3; i++) {
        for (int j = 1; j <= n; j++) {
            int num;
            cin >> num;
            scores[i][num] = j;
        }
    }

    for (int i = 1; i <= n * 4; i++)
        tree[i] = 1e9;

    // ์ฒซ๋ฒˆ์งธ ์‹œํ—˜ ๋“ฑ์ˆ˜๋Œ€๋กœ ์ •๋ ฌ
    for (int i = 1; i <= n; i++)
        firstTest[i] = { scores[0][i], i };
    sort(firstTest + 1, firstTest + n + 1);

    int ans = 0;
    for (int i = 1; i <= n; i++) {
        int index = firstTest[i].second;

        // ์ตœ์†Ÿ๊ฐ’์ด ํ˜„์žฌ ์—…๋ฐ์ดํŠธ ์ค‘์ธ ํ•™์ƒ์˜ ์„ธ๋ฒˆ์งธ ์‹œํ—˜ ๋“ฑ์ˆ˜๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๊ต‰์žฅํ•œ ํ•™์ƒ์ด๋‹ค.
        if (query(1, 1, n, 1, scores[1][index]) > scores[2][index])
            ans++;
        update(1, 1, n, scores[1][index], scores[2][index]);
    }
    cout << ans;
}

 

๋ฌธ์ œ : ๋ ˆ์ด์ง€ ํ”„๋กœํผ๊ฒŒ์ด์…˜(Lazy Propagation)

 

https://www.acmicpc.net/problem/10999

 

10999๋ฒˆ: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ 2

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)๊ณผ M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜์ด๊ณ , K๋Š” ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํšŸ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„

www.acmicpc.net

#include <iostream>
#include <algorithm>
using namespace std;

const int SIZE = 1 << 21;

struct SegTree {
    int treeStart;
    long long tree[SIZE], lazy[SIZE];

    SegTree() 
    {
        treeStart = SIZE / 2;
        fill(tree, tree + SIZE, 0);
        fill(lazy, lazy + SIZE, 0);
    }

    void init()
    {
        for (int i = treeStart - 1; i > 0; i--)
            tree[i] = tree[i * 2] + tree[i * 2 + 1];
    }

    // ๊ตฌ๊ฐ„([start, end)) node์˜ lazy ๊ฐ’์„ propagate
    void propagate(int node, int start, int end) 
    {
        if (lazy[node] != 0) {
            // ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ž์‹๋“ค์—๊ฒŒ lazy ๋ฏธ๋ฃธ
            if (node < treeStart) {
                lazy[node * 2] += lazy[node];
                lazy[node * 2 + 1] += lazy[node];
            }

            tree[node] += lazy[node] * (end - start);
            lazy[node] = 0;
        }
    }

    // ๊ตฌ๊ฐ„([left, right))์— value๋ฅผ ๋”ํ•˜๋ผ
    void update(int node, int start, int end, int left, int right, int value)
    {
        propagate(node, start, end);

        if (left >= end || right <= start)
            return;
        if (left <= start && end <= right) {
            lazy[node] += value;
            propagate(node, start, end);
            return;
        }

        int mid = (start + end) / 2;
        update(node * 2, start, mid, left, right, value);
        update(node * 2 + 1, mid, end, left, right, value);
        tree[node] = tree[node * 2] + tree[node * 2 + 1];
    }

    // ๊ตฌ๊ฐ„([left, right))์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ผ
    long long sum(int node, int start, int end, int left, int right)
    {
        propagate(node, start, end);

        if (left >= end || right <= start)
            return 0;
        if (left <= start && end <= right)
            return tree[node];

        int mid = (start + end) / 2;
        return sum(node * 2, start, mid, left, right) + sum(node * 2 + 1, mid, end, left, right);
    }
} seg;

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

    int N, M, K;
    cin >> N >> M >> K;

    for (int i = 0; i < N; i++)
        cin >> seg.tree[seg.treeStart + i];
    seg.init();

    for (int i = 0, a, b, c, d; i < M + K; i++) {
        cin >> a;
        if (a == 1) {
            cin >> b >> c >> d;
            seg.update(1, 0, seg.treeStart, b - 1, c, d);
        }
        else {
            cin >> b >> c;
            cout << seg.sum(1, 0, seg.treeStart, b - 1, c) << '\n';
        }
    }
}

 

๋ฌธ์ œ : ๋จธ์ง€ ์†ŒํŠธ ํŠธ๋ฆฌ

 

https://www.acmicpc.net/problem/13544

 

13544๋ฒˆ: ์ˆ˜์—ด๊ณผ ์ฟผ๋ฆฌ 3

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์—ด A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. i j k: Ai, Ai+1, ..., Aj๋กœ ์ด๋ฃจ์–ด์ง„ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘์—์„œ k๋ณด๋‹ค ํฐ ์›์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int SIZE = 1 << 18;

struct MergeSortTree {
    vector<int> arr[SIZE];

    void construct()
    {
        for (int i = SIZE / 2 - 1; i > 0; --i) {
            vector<int>& c = arr[i], & l = arr[i * 2], & r = arr[i * 2 + 1];
            arr[i].resize(l.size() + r.size());

            for (int j = 0, p = 0, q = 0; j < c.size(); ++j)
                c[j] = (q == r.size() || (p < l.size() && l[p] < r[q])) ? l[p++] : r[q++];
        }
    }

    int greater(int left, int right, int value, int node = 1, int start = 0, int end = SIZE / 2)
    {
        if (end <= left || right <= start)
            return 0;
        if (left <= start && end <= right)
            return arr[node].end() - upper_bound(arr[node].begin(), arr[node].end(), value); // value ๋ณด๋‹ค ํฐ ๊ฐœ์ˆ˜

        int mid = (start + end) / 2;
        return greater(left, right, value, node * 2, start, mid) + greater(left, right, value, node * 2 + 1, mid, end);
    }
}mst;

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

    int N;
    cin >> N;
    for (int i = 0; i < N; ++i) {
        int a;
        cin >> a;
        mst.arr[SIZE / 2 + i].push_back(a);
    }

    mst.construct();

    int M, L = 0;
    cin >> M;
    while (M--) {
        int i, j, k;
        cin >> i >> j >> k;
        L = mst.greater((i ^ L) - 1, j ^ L, k ^ L);
        cout << L << '\n';
    }
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] ๊ฐ•ํ•œ ์—ฐ๊ฒฐ ์š”์†Œ(ํƒ€์ž”, ์ฝ”์‚ฌ๋ผ์ฃผ)
  • [C++] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(ํฌ๋ฃจ์Šค์นผ)
  • [C++] ๋น„ํŠธ๋งˆ์Šคํฌ(BitMask)
  • [C++] ํŠธ๋ผ์ด(Trie)
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”