Cod sursa(job #3319352)

Utilizator TLuca2021Teodorescu Luca Nicolae TLuca2021 Data 31 octombrie 2025 19:43:57
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.9 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void AINT(long long node, long long left, long long right, vector<long long> &a, vector<long long> &segment_tree){
    if(left == right){
        segment_tree[node] = a[left];
    }
    else{
        long long mid = (left + right) / 2;
        AINT(2 * node, left, mid, a, segment_tree);
        AINT(2 * node + 1, mid + 1, right, a, segment_tree);
        segment_tree[node] = max(segment_tree[2 * node], segment_tree[2 * node + 1]);
    }
}
long long parcurgere(long long node, long long left, long long right, long long left_cautare, long long right_cautare, vector<long long> &segment_tree){
    if(left == left_cautare && right == right_cautare){
        return segment_tree[node];
    }
    long long mid = (left + right) / 2;
    if(mid + 1 <= left_cautare){
       return parcurgere(2 * node + 1, mid + 1, right, left_cautare, right_cautare, segment_tree);
    }
    else{
        if(mid + 1 > right_cautare){
            return parcurgere(2 * node, left, mid, left_cautare, right_cautare, segment_tree);
        }
        else{
            return max(parcurgere(2 * node, left, mid, left_cautare, mid, segment_tree), parcurgere(2 * node + 1, mid + 1, right, mid + 1, right_cautare, segment_tree));
        }
    }
}
void finding(long long node, vector<long long> &segment_tree){
    if(segment_tree[node] == max(segment_tree[2 * node], segment_tree[2 * node + 1])){
        return;
    }
    else{
        segment_tree[node] = max(segment_tree[2 * node], segment_tree[2 * node]);
        if(node == 1){
            return;
        }
        else{
            finding(node / 2, segment_tree);
        }
    }
}
void update(long long node, long long left, long long right, long long pos, long long val, vector<long long> &segment_tree){
    if(left == pos && right == pos){
        segment_tree[node] = val;
        finding(node, segment_tree);
    }
    else{
        long long mid = (left + right) / 2;
        if(mid + 1 <= pos){
            update(2 * node + 1, mid + 1, right, pos, val, segment_tree);
        }
        else{
            update(2 * node, left, mid, pos, val, segment_tree);
        }
    }
}
int main(){
    //cin.tie(nullptr)->sync_with_stdio(false);
    long long n, m;
    fin >> n >> m;
    vector<long long> a(n + 1);
    for(long long i = 1; i <= n; i++){
        fin >> a[i];
    }
    vector<long long> segment_tree(4 * n + 5, -1);
    AINT(1, 1, n, a, segment_tree);
    //pana aici a fost creat arborele de long longervale
    for(long long i = 0; i < m; i++){
        long long value, left, right;
        fin >> value >> left >> right;
        if(value == 0){
            fout << parcurgere(1, 1, n, left, right, segment_tree) << '\n';
        }
        else{
            update(1, 1, n, left, right, segment_tree);
        }
    }
    return 0;
}