Cod sursa(job #3228814)

Utilizator AndreiDocaDoca Andrei AndreiDoca Data 11 mai 2024 13:14:23
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <vector>

using namespace std;

vector<int> A, SegTree;

void build(int node, int left, int right)
{
    if(left == right)
    {
        SegTree[node] = A[left];
    }
    else
    {
        int mid = (left + right) / 2;

        build(2 * node, left, mid);

        build(2 * node + 1, mid + 1, right);

        SegTree[node] = max(SegTree[2 * node], SegTree[2 * node + 1]);
    }
}

int query(int node, int tl, int tr, int l, int r)
{
    if(r < tl || l > tr)
        return 0;

    if(l <= tl && tr <= r)
        return SegTree[node];
    
    int tm = (tl + tr) / 2;
    return max(query(2 * node, tl, tm, l, r), query(2 * node + 1, tm + 1, tr, l, r));
}

void update(int node, int l, int r, int idx, int val)
{
    if(l == r)
    {
        A[idx] = val;
        SegTree[node] = val;
    }
    else
    {
        int mid = (l + r) / 2;
        
        if(l <= idx && idx <= mid)
            update(2 * node, l, mid, idx, val);
        else
            update(2 * node + 1, mid + 1, r, idx, val);

        SegTree[node] = max(SegTree[2 * node], SegTree[2 * node + 1]);
    }
}

int main(void)
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int n, m;
    cin >> n >> m;

    A.resize(n);

    for(int i = 0; i < n; i++)
    {
        cin >> A[i];
    }

    SegTree.resize(4 * n);

    build(1, 0, n - 1);

    while(m--)
    {
        int op, a, b;
        cin >> op >> a >> b;
        a--;
        b--;
        if(op == 0) //query
            cout << query(1, 0, n - 1, a, b) << "\n";
        else //update
            update(1, 0, n - 1, a, b);
    }
    
    return 0;
}