Cod sursa(job #3128267)

Utilizator rockoanaOana Pasca rockoana Data 9 mai 2023 08:56:03
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 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, vector<i64>&v){
        len = next_pow2(n);
        data.assign(len, 0);

        for(i64 i = 0; i < n; i++){
            i64 id = len / 2 - 1 + i + 1;
            data[id] = v[i];
            while(id / 2 > 0){
                id /= 2;
                data[id] = max(data[id], v[i]);
            }
        }
    }

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

    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, r, cl, m, idx * 2), queryy(l, r, m + 1, cr, idx * 2 + 1));
        }
    }

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

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

    vector<i64> v(n);
    for(i64 i = 0; i < n; i++){
        cin >> v[i];
    }

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

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

    return 0;
}