Cod sursa(job #2285061)

Utilizator preda.andreiPreda Andrei preda.andrei Data 17 noiembrie 2018 23:34:40
Problema Arbori de intervale Scor 30
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <vector>

using namespace std;

class IntervalTree
{
public:
    IntervalTree(int nums) : nums_(nums)
    {
        auto len = nums + 10;
        while (nums > 0) {
            nums /= 2;
            len += nums;
        }
        vec_.resize(len, 0);
    }

    void SetVal(int pos, int num)
    {
        SetVal(0, 0, nums_ - 1, pos, num);
    }

    int GetMax(int left, int right) const
    {
        return GetMax(0, 0, nums_ - 1, left, right);
    }

private:
    vector<int> vec_;
    int nums_;

    static int LeftSon(int node) { return (node << 1) + 1; }
    static int RightSon(int node) { return (node << 1) + 2; }

    void SetVal(int node, int x, int y, int pos, int val);
    int GetMax(int node, int x, int y, int left, int right) const;
};

void IntervalTree::SetVal(int node, int x, int y, int pos, int val)
{
    if (x == y) {
        vec_[node] = val;
        return;
    }

    auto mid = x + (y - x) / 2;
    if (pos <= mid) {
        SetVal(LeftSon(node), x, mid, pos, val);
    } else {
        SetVal(RightSon(node), mid + 1, y, pos, val);
    }

    vec_[node] = max(vec_[LeftSon(node)], vec_[RightSon(node)]);
}

int IntervalTree::GetMax(int node, int x, int y, int left, int right) const
{
    if (left <= x && y <= right) {
        return vec_[node];
    }

    auto mid = x + (y - x) / 2;
    auto res = 0;

    if (left <= mid) {
        res = max(res, GetMax(LeftSon(node), x, mid, left, right));
    }
    if (mid < right) {
        res = max(res, GetMax(RightSon(node), mid + 1, y, left, right));
    }
    return res;
}

int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");

    int nums, queries;
    fin >> nums >> queries;

    IntervalTree tree(nums);
    for (int i = 0; i < nums; i += 1) {
        int val;
        fin >> val;
        tree.SetVal(i, val);
    }

    for (int i = 0; i < queries; i += 1) {
        int type, a, b;
        fin >> type >> a >> b;

        if (type == 0) {
            fout << tree.GetMax(a - 1, b - 1) << "\n";
        } else {
            tree.SetVal(a - 1, b);
        }
    }

    return 0;
}