Cod sursa(job #3124235)

Utilizator GFA03Gavrila Florin-Alexandru GFA03 Data 27 aprilie 2023 13:34:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");

#define maxn 100005

int v[maxn];
int aint[4*maxn];

void build(int n, int left, int right){
    int mid = (left + right)/2;
    if(left == right){
        aint[n] = v[left];
    }else{
        build(2*n, left, mid);
        build(2*n+1, mid+1, right);
        aint[n] = std::max(aint[2*n], aint[2*n+1]);
    }
}

void update(int n, int left, int right, int p, int val){
    int mid = (left + right)/2;
    if(left == right)
    {
        aint[n] = val;
        return;
    }   
        if(p <= mid){
            update(2*n, left, mid, p, val);
        }else{
            update(2*n+1, mid+1, right, p, val);
        }
        aint[n] = std::max(aint[2*n], aint[2*n+1]);
}

int query(int n, int left, int right, int a, int b){
    int mid = (left+right)/2;
    if(b < left || a > right)
        return 0;
    if(a <= left && right <= b)
        return aint[n];
    return std::max(query(2*n, left, mid, a, b),query(2*n+1, mid+1, right, a, b));
}


int main(){
    int n, k;
    fin >> n >> k;
    for(int i = 1; i <= n; i++){
        int x;
        fin >> x;
        v[i] = x;
    }
    build(1, 1, n);
    int operationType, leftIntervalOrPos, rightIntervalOrVal;
    for(int i = 1; i <= k; i++){
        fin >> operationType >> leftIntervalOrPos >> rightIntervalOrVal;
        if(operationType == 0)
            fout << query(1, 1, n, leftIntervalOrPos, rightIntervalOrVal) << '\n';
        else
            update(1, 1, n, leftIntervalOrPos, rightIntervalOrVal);
    }
}