Cod sursa(job #3311395)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 21 septembrie 2025 20:30:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

#define pb push_back

class SegmentTree
{
    int _n;
    vector <int> t;

public:
    SegmentTree(int n)
    {
        _n = n;
        t.resize(4 * n + 5);
    }

    void init(vector <int> &a, int v, int l, int r)
    {
        if(l == r)
        {
            t[v] = a[l];
//            cout << l << " " << r << " " << t[v] << "\n";
            return;
        }
        int mid = (l + r) / 2;
        init(a, 2 * v, l, mid);
        init(a, 2 * v + 1, mid + 1, r);
        t[v] = max(t[2 * v], t[2 * v + 1]);
//        cout << l << " " << r << " " << t[v] << "\n";
    }

    void update(int v, int l, int r, int poz, int x)
    {
        if(l == r)
        {
            t[v] = x;
            return;
        }
        int mid = (l + r) / 2;
        if(poz <= mid)
            update(2 * v, l, mid, poz, x);
        else
            update(2 * v + 1, mid + 1, r, poz, x);
        t[v] = max(t[2 * v], t[2 * v + 1]);
    }

    int query(int v, int l, int r, int tl, int tr)
    {
        if(tl > tr)
            return 0;
        if(tl == l  &&  tr == r)
            return t[v];
        int mid = (l + r) / 2;
        return max(query(2 * v, l, mid, tl, min(tr, mid)),
                   query(2 * v + 1, mid + 1, r, max(mid + 1, tl), tr));
    }
};

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

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

    SegmentTree aint(n);

    vector <int> a;
    a.resize(n + 1);

    for(int i = 1; i <= n; i ++)
        cin >> a[i];

//    for(int x : a)
//        cout << x << " ";
//    cout << "\n";

    aint.init(a, 1, 1, n);

    for(int i = 1; i <= m; i ++)
    {
        int op, a, b;
        cin >> op >> a >> b;
        if(op == 0)
        {
            cout << aint.query(1, 1, n, a, b) << "\n";
        }
        else
        {
            aint.update(1, 1, n, a, b);
        }
    }
    return 0;
}