Cod sursa(job #2789221)

Utilizator qubitrubbitQubit Rubbit qubitrubbit Data 27 octombrie 2021 10:09:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
// Online C++ compiler to run C++ program online
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define inf 1e9 + 1

const int CAPACITY = 100013;

class SegmentTree
{
private:
    int n;
    int tree[CAPACITY * 4];

    void update(int nodeId, int lower, int upper, int left, int right, int val)
    {
        if (lower > right || upper < left)
        {
            return;
        }
        if (left <= lower && upper <= right)
        {
            tree[nodeId] = val;
            return;
        }
        int mid = (lower + upper) / 2;
        update(nodeId * 2, lower, mid, left, right, val);
        update(nodeId * 2 + 1, mid + 1, upper, left, right, val);
        tree[nodeId] = max(tree[nodeId * 2], tree[nodeId * 2 + 1]);
    }

    int query(int nodeId, int lower, int upper, int left, int right)
    {
        if (lower > right || upper < left)
        {
            return -inf;
        }
        if (left <= lower && upper <= right)
        {
            return tree[nodeId];
        }
        int mid = (lower + upper) / 2;
        int max0 = query(nodeId * 2, lower, mid, left, right);
        int max1 = query(nodeId * 2 + 1, mid + 1, upper, left, right);
        return max(max0, max1);
    }

public:
    SegmentTree(int n)
    {
        this->n = n;
        fill(tree, tree + n, 0);
    }

    void set(int index, int value)
    {
        update(1, 1, n, index, index, value);
    }

    int query(int l, int r)
    {
        return query(1, 1, n, l, r);
    }
};

int main()
{
    int n, m, op, a, b;
    fin >> n >> m;
    SegmentTree segTree(n);
    for (int i = 1; i <= n; ++i)
    {
        fin >> a;
        segTree.set(i, a);
    }
    while (m-- > 0)
    {
        fin >> op >> a >> b;
        if (op == 0)
        {
            fout << segTree.query(a, b) << "\n";
        }
        else if (op == 1)
        {
            segTree.set(a, b);
        }
    }
    return 0;
}