본문 바로가기

공부합시다

세그트리

https://docs.google.com/presentation/d/10Hikfx-hyg1b4fOzXJkytsmJtTLlrdoFoL5guUfPtks/edit#slide=id.g62d05dd459_0_0

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;

int dp[100005][20];
int powv[20];



constexpr int clog2(int n) { return ((n < 2) ? 1 : 1 + clog2(n / 2)); }

template<typename T>
class SegmentTree
{
public:
    template<typename M>
    SegmentTree(const M& m) : merge(m) {}

    void init(const vector<T>& raw_)
    {
        raw = raw_;
        n = (int)raw.size();
        int sz = (1 << (clog2(n) + 1));
        data.resize(sz);

        _init(raw, 1, 0, n - 1);
    }

    T modify(int idx, function<T(T)> modifier) { return update(idx, modifier(raw[idx])); }
    T update(int idx, const T& newVal) { raw[idx] = newVal; return _update(1, 0, n - 1, idx, newVal); }
    T query(int left, int right) { return _query(1, 0, n - 1, left, right); }

private:
    vector<T> raw;
    vector<T> data;
    int n;
    using Merge = function<T(const T&, const T&)>;
    Merge merge;

    T _init(const vector<T>& raw, int node, int start, int end)
    {
        int mid = (start + end) / 2;
        if (start == end)
            return data[node] = raw[start];
        else
            return data[node] = merge(_init(raw, node * 2, start, mid),
                _init(raw, node * 2 + 1, mid + 1, end));
    }

    T _update(int node, int start, int end, int index, const T& newVal)
    {
        if (index < start || index > end)
            return data[node];

        if (start == end)
            data[node] = newVal;
        else
        {
            int mid = (start + end) / 2;
            data[node] = merge(_update(node * 2, start, mid, index, newVal),
                _update(node * 2 + 1, mid + 1, end, index, newVal));
        }

        return data[node];
    }

    T _query(int node, int start, int end, int left, int right)
    {
        if (left <= start && end <= right)
            return data[node];

        int mid = (start + end) / 2;

        if (mid < left)
            return _query(node * 2 + 1, mid + 1, end, left, right);

        if (mid + 1 > right)
            return _query(node * 2, start, mid, left, right);

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

int main() {
    auto tree = SegmentTree<int>([](int l, int r) { return min(l, r); });
    int n, q;
    scanf("%d %d", &n, &q);
    
    tree.init(v);
    
    for (int i = 0; i < q; i++) {
        
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d\n", tree.query(a, b)); 
    }
    
    return 0;
}

'공부합시다' 카테고리의 다른 글

투포인터 예시 코드  (0) 2021.09.23
다익스트라  (0) 2021.07.31
pbds  (0) 2021.05.08
LIS 최장 증가 부분 수열  (0) 2020.10.25
결과 MOD 나누는 거 관련  (0) 2020.10.15