Cod sursa(job #3128270)

Utilizator rockoanaOana Pasca rockoana Data 9 mai 2023 09:06:37
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

using i64 = int64_t;
const i64 INF = INT_MAX;

class segtree{
private:
    i64 len;
    vector<i64> data;

    i64 next_pow2(i64 n){
        i64 res = 1;
        while(res < n){
            res *= 2;
        }
        res *= 2;
        return res;
    }

public:
    segtree(i64 n){
        len = next_pow2(n);
        data.assign(len, 0);
    }

    void set_value(i64 idx, i64 x){
        idx += len/2;
        data[idx] = x;
        idx /= 2;
        while(idx > 0){
            data[idx] = max(data[idx * 2], data[idx * 2 + 1]);
            idx /= 2;
        }
    }

    i64 queryy(i64 l, i64 r, i64 cl, i64 cr, i64 idx){
        if(cl == l && cr == r){
            return data[idx];
        }

        i64 m = (cl+ cr) / 2;
        if(m >= r){
            return queryy(l, r, cl, m, idx * 2);
        }else if(m < l){
            return queryy(l, r, m + 1, cr, idx * 2 + 1);
        }else{
            return max(queryy(l, m, cl, m, idx * 2), queryy(m + 1, r, m + 1, cr, idx * 2 + 1));
        }
    }

    i64 query(i64 l, i64 r){
        return queryy(l, r, 0, len / 2 - 1, 1);
    }
};

int main()
{
    i64 n, m;
    cin >> n >> m;

    segtree st(n);
    for(i64 i = 0; i < n; i++){
        i64 x;
        cin >> x;
        st.set_value(i, x);
    }

    i64 t, a, b;
    for(i64 i = 0; i < m; i++){
        cin >> t >> a >> b;

        if(!t){
            a--;
            b--;
            cout << st.query(a, b) << endl;
        }else{
            a--;
            st.set_value(a, b);
        }
    }

    return 0;
}