알고리즘&자료구조

세그먼트 트리 템플릿 (c++)

Nakuri 2025. 8. 30. 23:48

재귀 + 1-based (수정 용이)

class segtree {
public:
  int size;
  vector<int> tree;
  segtree(int n) {
    for (size = 1; size < n; size <<= 1)
      ;
    tree.resize(size * 2);
  }
  void update(int pos, int val) {
    pos += size - 1;
    tree[pos] += val;
    for (pos /= 2; pos; pos /= 2) {
      tree[pos] = tree[pos * 2] + tree[pos * 2 + 1];
    }
  }
  int query(int n, int s, int e, int l, int r) {
    if (r < s || e < l)
      return 0;
    if (l <= s && e <= r)
      return tree[n];
    int m = (s + e) >> 1;
    return query(n * 2, s, m, l, r) + query(n * 2 + 1, m + 1, e, l, r);
  }
  int query(int l, int r) { return query(1, 1, size, l, r); }
};

 

 

비재귀 + 0-based (빠름)

class segtree {
public:
  int size;
  vector<ll> tree;
  segtree(int n) {
    size = 1;
    while (size < n)
      size *= 2;
    tree.assign(2 * size, 0);
  }

  void update(int i, ll x) {
    i += size;
    tree[i] += x;
    for (i /= 2; i >= 1; i /= 2) {
      tree[i] = tree[2 * i] + tree[2 * i + 1];
    }
  }

  // [l, r)
  ll query(int l, int r) {
    ll res = 0;
    for (l += size, r += size; l < r; l /= 2, r /= 2) {
      if (l % 2)
        res = res + tree[l++];
      if (r % 2)
        res = res + tree[--r];
    }
    return res;
  }
};

 

 

728x90

'알고리즘&자료구조' 카테고리의 다른 글

x^n 분할정복 (빠른 거듭제곱, c++)  (0) 2025.04.18
PS 템플릿 (C++)  (0) 2025.02.12