Cod sursa(job #2435853)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 4 iulie 2019 13:46:53
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

class ArbInt
{
public:
    ArbInt(vector<int> &vals)
    {
        for (size = 1; size < int(vals.size()); size <<= 1)
            ;

        tree = vector<int>(2 * size, 0);
        for (int i = 0; i < vals.size(); i++)
            tree[size + i] = vals[i];

        for (int i = size - 1; i > 0; i--)
            tree[i] = max(tree[2 * i], tree[2 * i + 1]);
    }

    void Update(int pos, int val)
    {
        pos += size;
        tree[pos] = val;
        for (pos >>= 1; pos > 0; pos >>= 1)
            tree[pos] = max(tree[2 * pos], tree[2 * pos + 1]);
    }

    int Query(int l, int r) const
    {
        l += size;
        r += size;
        int max_val = 0;
        while (l <= r)
        {
            max_val = max(max_val, max(tree[l], tree[r]));
            l = (l + 1) / 2;
            r = (r - 1) / 2;
        }

        return max_val;
    }

private:
    int size;
    vector<int> tree;
};

int main()
{
    ifstream is("arbint.in");
    ofstream os("arbint.out");

    int n, m;
    is >> n >> m;

    vector<int> vals;
    for (int x, i = 0; i < n; i++)
    {
        is >> x;
        vals.push_back(x);
    }

    ArbInt tree(vals);

    for (int op, x, y, i = 0; i < m; i++)
    {
        is >> op >> x >> y;
        switch (op)
        {
        case 0:
            os << tree.Query(x - 1, y - 1) << '\n';
            break;
        case 1:
            tree.Update(x - 1, y);
            break;
        }
    }

    is.close();
    os.close();
    return 0;
}